4

私はかなり長い間、深度ストリームを Kinect からの RGB ストリームに合わせようと試みてきました。私はそれについていくつかの記事を読みましたが、それを機能させることができないため、いくつかの重要なポイントが欠けているに違いありません...

これが私がなんとかしたことの画像です。簡単に見つけられるずれを丸で囲みました Kinect 深度のずれ

これをできるだけ小さなコードにまとめようとしましたが、それでもかなりの量のコードなのでご容赦ください。以下のコード スニペットは、深度と RGB フレームの準備ができるたびに Kinect SDK が呼び出すものです。

ご覧のとおり、私は実験してきました

ColorImagePoint colorpoint = _Sensor.CoordinateMapper.MapDepthPointToColorPoint(DepthImageFormat.Resolution640x480Fps30, depthpoint, ColorImageFormat.RgbResolution640x480Fps30);

CoordinateMapper.MapDepthFrameToColorFrame を使用することをお勧めします (これで問題を解決できるはずです) が、動作させることができません..おそらく正しく実行していません..

Microsoft Kinect SDK 1.6 を使用しています。

private void EventAllFramesReady(Object Sender, AllFramesReadyEventArgs e)
{
    System.Drawing.Color color;

    Bitmap image = null;
    Bitmap depth = null;

    using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
    {
        using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
        {
            // color 
            image = new Bitmap(colorFrame.Width, colorFrame.Height);
            byte[] colorPixels = new byte[colorFrame.PixelDataLength];
            colorFrame.CopyPixelDataTo(colorPixels);

            //lock bitmap, and work with BitmapData (way faster than SetPixel())
            BitmapData imageBitmapData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height),
                                                ImageLockMode.WriteOnly,
                                                image.PixelFormat);
            IntPtr IptrImage = imageBitmapData.Scan0;
            byte[] PixelsImage = new byte[image.Width * image.Height * 4];


            // depth
            depth = new Bitmap(depthFrame.Width, depthFrame.Height);
            DepthImagePixel[] depthData = new DepthImagePixel[depthFrame.PixelDataLength];
            depthFrame.CopyDepthImagePixelDataTo(depthData);

            //lock bitmap, and work with BitmapData (way faster than SetPixel())
            BitmapData depthBitmapData = depth.LockBits(new Rectangle(0, 0, depth.Width, depth.Height),
                                                ImageLockMode.WriteOnly,
                                                depth.PixelFormat);
            IntPtr IptrDepth = depthBitmapData.Scan0;
            byte[] PixelsDepth = new byte[depth.Width * depth.Height * 4];


            DepthImagePoint depthpoint = new DepthImagePoint();

            for (int x = 1; x < colorFrame.Width; x++)
            {
                for (int y = 1; y < colorFrame.Height; y++)
                {
                    int i = ((y * image.Width) + x) * 4;

                    short depthdistanceRAW = (depthData[x + y * depth.Width]).Depth;

                    // convert distance value into a color
                    color = System.Drawing.Color.Pink;
                    if (depthdistanceRAW > 0 && depthdistanceRAW <= 4000)
                    {
                        int depthdistance = (int)((depthdistanceRAW / 4090f) * 255f);
                        color = System.Drawing.Color.FromArgb((int)(depthdistance / 2f), depthdistance, (int)(depthdistance * 0.7f));
                    }

                    depthpoint.X = x;
                    depthpoint.Y = y;
                    depthpoint.Depth = depthdistanceRAW;

                    ColorImagePoint colorpoint = _Sensor.CoordinateMapper.MapDepthPointToColorPoint(DepthImageFormat.Resolution640x480Fps30, depthpoint, ColorImageFormat.RgbResolution640x480Fps30);

                    //if (colorpoint.X > 0 && colorpoint.X <= 640 && colorpoint.Y > 0 && colorpoint.Y <= 480)
                    //{
                    int adjustedposition = ((colorpoint.Y * image.Width) + colorpoint.X) * 4;
                    //if (adjustedposition < depthData.Length)
                    //{
                    PixelsDepth[i] = color.B;
                    PixelsDepth[i + 1] = color.G;
                    PixelsDepth[i + 2] = color.R;
                    PixelsDepth[i + 3] = DepthTransparency;
                    //}
                    //}

                    PixelsImage[i] = colorPixels[i];
                    PixelsImage[i + 1] = colorPixels[i + 1];
                    PixelsImage[i + 2] = colorPixels[i + 2];
                    PixelsImage[i + 3] = 255;
                }
            }

            Marshal.Copy(PixelsImage, 0, IptrImage, PixelsImage.Length);
            image.UnlockBits(imageBitmapData);

            Marshal.Copy(PixelsDepth, 0, IptrDepth, PixelsDepth.Length);
            depth.UnlockBits(depthBitmapData);
        }
    }

    _kf.UpdateImage(image); // update the RGB picture in the form
    _kf.UpdateDepth(depth); // update the Depth picture in the form
}
4

1 に答える 1