在opencv c ++中将一组3D点投影到虚拟图像平面中

时间:2014-02-19 13:30:26

标签: c++ opencv kinect

任何人都知道如何在opencv c ++中将一组3D点投影到虚拟图像平面中 谢谢

2 个答案:

答案 0 :(得分:0)

首先,您需要定义变换矩阵(旋转,平移等)以将3D空间映射到2D虚拟图像平面,然后将3D点坐标(x,y,z)乘以矩阵以获得图像中的2D坐标。

答案 1 :(得分:0)

注册(OpenNI 2)或替代viewPoint功能(openNI 1.5)确实有助于使用单行代码将深度与rgb对齐。您支付的价格是您无法真正恢复3D空间中的精确X,Y点位置,因为行和列在对齐后移动。

有时你不仅需要Z而且需要X,Y并且希望它们是准确的;加上你想要深度和rgb的对齐。然后你必须将rgb与深度对齐。请注意,Kinect / OpenNI不支持此对齐。您为此付出的代价 - 在未定义深度的位置没有RGB值。

如果有人知道外部参数是深度相机相对于颜色的旋转和平移,那么对齐只是制作另一种观点的问题:从深度恢复3D,然后从视角看你的点云彩色摄像机:应用反向旋转和平移。例如,向右移动相机就像向左移动世界(点)。将3D重新投影到2D并根据需要进行插值。这非常简单,只是三维重建的反面;在下面,Cx接近w / 2,Cy接近h / 2;

col = focal * X / Z + Cx row = -focal * Y / Z + Cy //这是因为图像中的行向下增加

在点云旋转后获得一个漂亮的深度贴图的正确但也更昂贵的方法是跟踪来自每个像素的光线,直到它与点云相交或足够接近其中一个点。通过这种方式,由于采样伪像,您的深度图中的孔将更少。