繁体   English   中英

Kinect v2 红外传感器和 RGB 图像的对齐总是略微关闭

[英]Kinect v2 Alignment of Infrared Sensor & RGB Image always slightly off

我使用官方 Kinect SDK 2.0 和 Emgu CV 来识别魔方的颜色。

在此处输入图片说明

起初我在红外相机上使用 Canny 边缘提取,因为它比 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;
    }

我们可以通过将红外图像坐标转换为具有 2 个四边形映射的彩色图像坐标来解决这个问题。

红外图像中的四边形Q(x1,y1,x2,y2,x3,y3,x4,y4)类似地,它映射四边形Q'(x1',y1',x2',y2',x3',y3',x4',y4')在相应的彩色图像中。

我们可以将上述映射写成等式如下:

Q'= Q*A

其中,A 是一个 3 X 3 矩阵,系数为 a11、a12、a13、a21、..、a33;

获得系数的公式如下:

x1=173; y1=98; x2=387; y2=93; x3=395; y3=262; x4=172; y4=264;  
x1p=787; y1p=235;  x2p=1407; y2p=215; x3p=1435; y3p=705;  x4p=795; y4p=715; 
tx=(x1p-x2p+x3p-x4p)*(y4p-y3p)-(y1p-y2p+y3p-y4p)*(x4p-x3p);
ty=(x2p-x3p)*(y4p-y3p)-(x4p-x3p)*(y2p-y3p);
a31=tx/ty;
tx=(y1p-y2p+y3p-y4p)*(x2p-x3p)-(x1p-x2p+x3p-x4p)*(y2p-y3p);
ty=(x2p-x3p)*(y4p-y3p)-(x4p-x3p)*(y2p-y3p);
a32=tx/ty;
a11=x2p-x1p+a31*x2p;
a12=x4p-x1p+a32*x4p;
a13=x1p;
a21=y2p-y1p+a31*y2p;
a22=y4p-y1p+a32*y4p;
a23=y1p;
a33=1.0;

这是因为检索深度数据的相机和检索颜色数据的相机不是同一个相机。 因此,您应该应用校正因子来置换深度数据。 它是一个几乎恒定的因素,但与距离有关。 我没有给你的代码,但你可以自己计算。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM