我正在尝试将我的 OpenNI (1.5.4.0) Kinect 4 Windows Depthmap 映射到 OpenCV RGB 图像。
我有深度图 640x480,深度为 mm,试图像 Burrus 一样进行映射:http: //burrus.name/index.php/Research/KinectCalibration
我跳过了失真部分,但除此之外我做了我认为的一切:
//with depth camera intrinsics, each pixel (x_d,y_d) of depth camera can be projected
//to metric 3D space. with fx_d, fy_d, cx_d and cy_d the intrinsics of the depth camera.
P3D.at<Vec3f>(y,x)[0] = (x - cx_ir) * depth/fx_ir;
P3D.at<Vec3f>(y,x)[1] = (y - cy_ir) * depth/fy_ir;
P3D.at<Vec3f>(y,x)[2] = depth;
//P3D' = R.P3D + T:
RTMat = (Mat_<float>(4,4) << 0.999388, -0.00796202, -0.0480646, -3.96963,
0.00612322, 0.9993536, 0.0337474, -22.8512,
0.0244427, -0.03635059, 0.999173, -15.6307,
0,0,0,1);
perspectiveTransform(P3D, P3DS, RTMat);
//reproject each 3D point on the color image and get its color:
depth = P3DS.at<Vec3f>(y,x)[2];
x_rgb = (P3DS.at<Vec3f>(y,x)[0] * fx_rgb/ depth + cx_rgb;
y_rgb = (P3DS.at<Vec3f>(y,x)[1] * fy_rgb/ depth + cy_rgb;
但是根据我对 Kinect 的 RGB 摄像头和红外摄像头的估计校准值,我的结果在各个方向上都失败了,并且不能仅通过更改外部 T 参数来修复。
我有几个怀疑:
- OpenNi 是否已经将 IR Depthmap 映射到 Kinect 的 RGB 摄像头?
- 我应该以米为单位使用深度,还是将像素转换为毫米?(我尝试乘以 pixel_size * 0.001 但我得到了相同的结果)
真的希望有人能帮助我。提前谢谢。