本次主要学习两个使用标定+变换矩阵进行配准的方法,我还没有实际去做,暂时仅做理论学习。
1、Kinect深度图与摄像头RGB的标定与配准
作者:aipiano
作者使用了第三方摄像头采集RGB图像,Kinect一代采集深度图像。
第一步:RGB摄像头标定
棋盘法:用待标定的摄像头拍摄多幅不同视角下的棋盘图片,将这些图片扔给OpenCV或Matlab,从而计算出该摄像头的内参以及对应于每一幅图像的外参。
第二步:深度摄像头的标定
棋盘法:外置红外光源照射棋盘图,同时用黑胶带把Kinect红外发射器完全挡住,深度摄像头获取多幅红外图后,同样使用OpenCV或MATLAB计算参数。
第三步:计算内参
使用GML Calibration Toolbox计算RGB摄像头和Kinect深度摄像头的内参。
第四步:配准(核心部分)
这一部分的原理原博讲的很清楚,先利用深度摄像头内参矩阵把深度平面坐标(深度图坐标)转换到深度摄像头空间坐标,再利用外参计算旋转矩阵和平移矩阵,把深度摄像头空间坐标转换到RGB摄像头空间坐标,最后利用RGB摄像头内参矩阵把RGB摄像头空间坐标转换到RGB平面坐标(RGB图坐标)。这里只记录一下最终测试程序的思路:
- 获取Kinect的深度图像;
- 获取RGB摄像头的图像;
- 为深度图像中的每一个像素附上对应的RGB颜色,比如你要给坐标为(x, y)的深度图像素附上颜色,具体步骤如下;
- 构造一个三维向量
p_ir = (x, y, z)
,其中x,y是该点的像素坐标,z是该像素的深度值; - 用Kinect内参矩阵
H_ir
的逆,乘以p_ir
得到对应的空间点坐标P_ir
,具体公式见原文第四部分(配准); - 由于
P_ir
是该点在Kinect坐标系下的坐标,我们需要将其转换到RGB摄像头的坐标系下,具体的,就是乘以一个旋转矩阵R
,再加上一个平移向量T
,得到P_rgb
; - 用RGB摄像头的内参矩阵
H_rgb
乘以P_rgb
,得到p_rgb
,p_rgb
也是一个三维向量,其x和y坐标即为该点在RGB图像中的像素坐标,取出该像素的颜色,作为深度图像中对应像素的颜色; - 对深度图像中的每一个像素都做上述操作,得到配准后的深度图。
需要注意的是,p_ir
和p_rgb
使用的都是齐次坐标,因此在构造p_ir
时,应将原始的像素坐标(x,y)乘以深度值,而最终的RGB像素坐标必须将p_rgb
除以z分量,即(x/z,y/z),且z分量的值即为该点到RGB摄像头的距离(单位为毫米)。
虽然没有实际去做,但是感觉很有可操作性,每一步都很具体,从作者的截图来看效果也不错。
2、kinect 2.0 SDK学习笔记(四)--深度图与彩色图对齐
作者:jiaojialulu
方法、公式和上面都一样,还有源程序。源程序先不分析了,用到的时候再看。相机参数计算工具:Camera Calibration Toolbox for Matlab
另外,作者用SDK的MapDepthFrameToColorSpace
函数法和上面这种标定配准法的结果图像中都有重复纹理,他分析认为是因为深度摄像头和彩色摄像头不重合,导致深度图上的一部分在实际的场景中不能被彩色摄像头捕获,导致附着遮挡物体的纹理。
关于重复纹理的问题,参考StackOverflow上的一个提问:Kinect for Windows v2 depth to color image misalignment
小结
深度图与彩色图配准的方法:
- SDK函数:
MapColorFrameToDepthSpace
或MapDepthFrameToColorSpace
。 - 标定+坐标空间变换:
先用棋盘法计算深度相机和RGB相机的内参、外参,再按如下顺序进行坐标空间转换。(SDK函数所做的应该就是这部分工作)
深度平面坐标(深度图坐标) -> 深度相机空间坐标 -> RGB相机空间坐标 -> RGB平面坐标(RGB图坐标) - 特征匹配:
利用特征匹配方法匹配两幅图的特征点对,进而配准。这种方法还没有研究。
3/09更新:
在用SDK函数MapColorFrameToDepthSpace
时发现两个问题。
1、为了深度图显示,往往会扩大深度图数据一定倍数(我扩大了8倍,即左移3位),这会导致配准结果不准确,深度图相对彩色图有一定偏移。
2、与彩色图对齐的深度图两侧边缘有弧度,这是不是产生了畸变??
另外,我在重建配准彩色图的过程中出现了残影,其原因是每次填充新一帧配准彩色图时没有刷新Mat为全0,导致有些无效的像素仍然保留了上一帧的像素。解决方法就是每次填充前重置Mat为全0矩阵。
再另外,使用MapDepthFrameToColorSpace
重建配准彩色图时出现了重影(重复纹理),原因如上面所说,应该是因为深度和彩色相机视角不同,导致(尤其是近处的)遮挡边缘处,深度相机能获取,但彩色相机不能获取,因此此处的深度像素重复对应了遮挡物体边缘像素。