有人知道如何在opencv c++中将一组三维点投影到虚拟图像平面上吗?
谢谢
发布于 2014-02-19 22:21:41
首先,您需要定义变换矩阵(旋转、平移等)以将3D空间映射到2D虚拟图像平面,然后将3D点坐标(x,y,z)与矩阵相乘,即可获得图像中的2D坐标。
发布于 2014-02-22 16:24:07
注册(RGB2)或替代viewPoint功能(RGB1.5)确实有助于使用一行代码将深度与openNI对齐。你付出的代价是,你不能真正恢复三维空间中精确的X,Y点位置,因为行和列在对齐后移动。
有时,您不仅需要Z,还需要X、Y,并希望它们精确;此外,您还希望深度和rgb对齐。然后,您必须将rgb与深度对齐。请注意,Kinect/OpenNI不支持此对齐方式。你为此付出的代价-在深度未定义的位置没有RGB值。
如果一个人知道外部参数,即深度相机相对于颜色相机的旋转和平移,那么对齐只是一个创建另一个视点的问题:从深度恢复3D,然后从彩色相机的角度查看您的点云:即应用反向旋转和平移。例如,向右移动摄影机就像向左移动世界(点)。将3D重新投影到2D,并在需要时进行插值。这真的很容易,只是3d重建的逆;下面,Cx接近w/2,Cy接近h/2;
col =焦点*X/Z+Cx行=-焦点*Y/Z+Cy //这是因为图像中的行数向下增加
要在点云旋转后获得良好的深度图,一个合适但也更昂贵的方法是跟踪每个像素的光线,直到它与点云相交或足够接近其中一个点。这样,由于采样瑕疵,深度贴图中的孔洞会更少。
https://stackoverflow.com/questions/21881973
复制相似问题