投影图像平面中的3D点

时间:2018-04-13 11:26:06

标签: matlab image-processing 3d mapping

我正在尝试按照 - here提供的公式将3D点云投影到图像平面上。 我的代码是:

side: THREE.BackSide

平移向量除以1000,因为该值以mm为单位但我需要以m为单位。 Td=[0.994700168903275 0.0521802707917803 0.0885934158044077 -1.09405637454607/1000; -0.0536097887263755 0.998466155670681 0.0138320834629078 24.2728498290288/1000; -0.0877357654352521 -0.0185082500606608 0.995971826982662 9.35239973330908/1000; 0 0 0 1]; xd=xyz(:,1); yd=xyz(:,2); zd=xyz(:,3); xyz_c=zeros(76800,4); for i=1:76800 b=[xd(i); yd(i); zd(i); 1]; xyz_c(i,:)=mtimes(Td,b); end uc=(xyz_c(:,1)./xyz_c(:,3))*250.406303917333+162.663763325924; vc=(xyz_c(:,2)./xyz_c(:,3))*249.362838052888+119.937781665327; figure(1) imshow(scene2);hold on; plot(uc,vc);hold off; 是我想要匹配3D点的相应场景。不知何故,我得到的预测点太低,换句话说,vc值太大了。当我在图片上绘制scene2uc时,我得到了这个:

projection image

很难看到,但3D标记的顶部位于标记开头的位置,点数应该高出60个像素。当我执行以下vc时,结果会更好:

result

我获得了一个XYZ坐标的点云,因此xyz变量基本上是来自导出点云的信息。希望我能很好地解释我的问题。

问题是,代码有什么问题,或者我错过了什么?

图片:enter image description here imshow(scene2);hold on; plot(uc,vc-60);hold off;情节:enter image description here 点云:enter image description here 深度图像:enter image description here

2 个答案:

答案 0 :(得分:0)

假设你的cTd转换矩阵是正确的,我唯一想到的是在Matlab中交换行和列。因此,将等式更改为:

uc=(xyz_c(:,1)./xyz_c(:,3))*250.406303917333+119.937781665327;
vc=(xyz_c(:,2)./xyz_c(:,3))*249.362838052888+162.663763325924;

尝试一下,但我不确定。如你所说,像素仅在vc中关闭。但是,它应该在两个方向上关闭大约40像素。

答案 1 :(得分:0)

好的,用户Amro帮助我并指出了问题所在。如果你还记得RGB是camera1,那么当我进行立体声校准时,ToF传感器就是camera2。问题是,当我试图将3D点(从ToF)转换为图像帧x1 = R*x2 + t=Td*x2时,我的想法只是在x2输入3D坐标值然后我会得到图像框架中的对应坐标,但实际上我必须x1=inv(Td)*x2,现在场景叠加,因为它们应该基于所支持的理论 - here。谢谢大家的回答,非常感谢!

此致 Kuchx