我正在尝试按照 - 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值太大了。当我在图片上绘制scene2
和uc
时,我得到了这个:
很难看到,但3D标记的顶部位于标记开头的位置,点数应该高出60个像素。当我执行以下vc
时,结果会更好:
我获得了一个XYZ坐标的点云,因此xyz变量基本上是来自导出点云的信息。希望我能很好地解释我的问题。
问题是,代码有什么问题,或者我错过了什么?
图片:
imshow(scene2);hold on; plot(uc,vc-60);hold off;
情节:
点云:
深度图像:
答案 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