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);
}
}
这是我创建的辅助函数,目的是将红外线-Space 中的点阵列转换为彩色-Space
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;
我正在使用官方 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);
}
}
这是我创建的辅助函数,目的是将红外线-Space 中的点阵列转换为彩色-Space
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;