예제 #1
0
        /// <summary>
        /// 距離データをカラー画像に変換する
        /// </summary>
        /// <param name="depthFrame"></param>
        /// <returns></returns>
        private static byte[] ConvertDepthToColor(DepthImageFrame depthFrame)
        {
            // 距離カメラのピクセルごとのデータを取得する
            short[] depthPixel = depthFrame.ToPixelData();

            // 画像化データを作成する
            byte[] depthColor = new byte[depthFrame.Width * depthFrame.Height * BytesPerPixel];

            // 画像化する
            for (int i = 0; i < depthPixel.Length; i++)
            {
                // 距離カメラのデータから、距離とプレイヤーIDを取得する
                int distance = depthPixel[i] >> DepthImageFrame.PlayerIndexBitmaskWidth;
                int player   = depthPixel[i] & DepthImageFrame.PlayerIndexBitmask;

                // バイトインデックスを計算する
                int index = i * BytesPerPixel;

                byte gray = (byte)~(byte)KinectUtility.ScaleTo(distance, 0x0FFF, 0xFF);
                depthColor[index + 0] = gray;
                depthColor[index + 1] = gray;
                depthColor[index + 2] = gray;
            }

            return(depthColor);
        }
예제 #2
0
        /// <summary>
        /// 距離データをカラー画像に変換する
        /// </summary>
        /// <param name="depthFrame"></param>
        /// <returns></returns>
        private static byte[] ConvertDepthToColor(DepthImageFrame depthFrame, KinectSensor kinect)
        {
            // 距離カメラのピクセルごとのデータを取得する
            short[] depthPixel = depthFrame.ToPixelData();

            // 画像化データを作成する
            byte[] depthColor = new byte[depthFrame.Width * depthFrame.Height * BytesPerPixel];

            var colorPoints = new ColorImagePoint[kinect.ColorStream.FrameWidth * kinect.ColorStream.FrameHeight];

            kinect.CoordinateMapper.MapDepthFrameToColorFrame(kinect.DepthStream.Format,
                                                              depthFrame.ToDepthImagePixel(), kinect.ColorStream.Format, colorPoints
                                                              );

            // 画像化する
            for (int i = 0; i < depthPixel.Length; i++)
            {
                // 距離カメラのデータから、距離とプレイヤーIDを取得する
                int distance = depthPixel[i] >> DepthImageFrame.PlayerIndexBitmaskWidth;
                int player   = depthPixel[i] & DepthImageFrame.PlayerIndexBitmask;

                // バイトインデックスを計算する
                int index = (colorPoints[i].Y * kinect.ColorStream.FrameWidth + colorPoints[i].X) * BytesPerPixel;

                byte gray = (byte)~(byte)KinectUtility.ScaleTo(distance, 0x0FFF, 0xFF);
                depthColor[index + 0] = gray;
                depthColor[index + 1] = gray;
                depthColor[index + 2] = gray;
            }

            return(depthColor);
        }
        /// <summary>
        /// スケルトン(3D)座標を2D座標に変換する
        /// </summary>
        /// <param name="position"></param>
        /// <returns></returns>
        private Point SkeletonToPiont(SkeletonPoint position)
        {
            Point point;
            Point _2d;

            if (SkeletonConvert == Skeleton2DPoint.Color)
            {
                var p = mapper.MapSkeletonPointToColorPoint(position, kinect.ColorStream.Format);
                point = new Point(p.X, p.Y);
                _2d   = new Point(kinect.ColorStream.FrameWidth, kinect.ColorStream.FrameHeight);
            }
            else
            {
                var p = mapper.MapSkeletonPointToDepthPoint(position, kinect.DepthStream.Format);
                point = new Point(p.X, p.Y);
                _2d   = new Point(kinect.DepthStream.FrameWidth, kinect.DepthStream.FrameHeight);
            }

            return(KinectUtility.ScaleTo(point, _2d, new Point(canvas.ActualWidth, canvas.ActualHeight)));
        }