我使用官方的Kinect SDK 2.0和Emgu CV来识别Rubik's Cube的颜色。

首先,我在红外相机上使用Canny Edge Extraction,因为它比RGB相机能更好地处理不同的闪电条件,并且能更好地检测轮廓。

然后,我使用此代码将红外传感器的坐标转换为RGB摄像机的坐标。
如您在图片中所看到的,它们仍然与我所寻找的不符。由于我已经使用了官方的KinectSensor.CoordinateMapper.MapDepthFrameToColorSpace,所以我不知道如何改善这种情况。

using (var colorFrame = reference.ColorFrameReference.AcquireFrame())
using (var irFrame = reference.InfraredFrameReference.AcquireFrame())
{
    if (colorFrame == null || irFrame == null)
        return;

    // initialize depth frame data
    FrameDescription depthDesc = irFrame.FrameDescription;

    if (_depthData == null)
    {
        uint depthSize = depthDesc.LengthInPixels;
        _depthData = new ushort[depthSize];
        _colorSpacePoints = new ColorSpacePoint[depthSize];

         // fill Array with max value so all pixels can be mapped
         for (int i = 0; i < _depthData.Length; i++)
         {
             _depthData[i] = UInt16.MaxValue;
         }
         // didn't work so well with the actual depth-data
         //depthFrame.CopyFrameDataToArray(_depthData);

        _sensor.CoordinateMapper.MapDepthFrameToColorSpace(_depthData, _colorSpacePoints);
    }
}

这是我创建的一个辅助函数,用于将红外空间中的点阵列转换为色彩空间
public static System.Drawing.Point[] DepthPointsToColorSpace(System.Drawing.Point[] depthPoints, ColorSpacePoint[] colorSpace){
        for (int i = 0; i < depthPoints.Length; i++)
        {
            // 512 is the width of the depth/infrared image
            int index = 512 * depthPoints[i].Y + depthPoints[i].X;

            depthPoints[i].X = (int)Math.Floor(colorSpace[index].X + 0.5);
            depthPoints[i].Y = (int)Math.Floor(colorSpace[index].Y + 0.5);
        }
        return depthPoints;
    }

最佳答案

这是因为它与获取深度数据的相机和获取颜色数据的相机不是同一台相机。
因此,您应该应用校正因子来替换深度数据。
它的因数几乎恒定,但与距离有关。
我没有适合您的代码,但是您可以自己计算。

10-02 01:54