Matlab中三维坐标到像素坐标的转换
我正在编写模拟立体视觉的代码,发现3D到2D映射存在一些问题。我正在查看的对象是围绕轴原点构建的,相机目标设置为Matlab中三维坐标到像素坐标的转换,matlab,3d,mapping,2d,Matlab,3d,Mapping,2d,我正在编写模拟立体视觉的代码,发现3D到2D映射存在一些问题。我正在查看的对象是围绕轴原点构建的,相机目标设置为[0] 摄影机上方向向量为[0 0 1],因此摄影机参考系和世界(对象)参考系相同。要将三维点映射为二维点,我有: [x/z y/z 1]' = K * P * [X Y Z 1]' 其中[x/z y/z]是使用齐次表示法位于[x y z 1]处的3D点的像素坐标K是3 x 4校准矩阵(最后一列由零组成),而P是4 x 4投影矩阵 因为我还需要模拟校准过程,所以我使用加州理工学院的M
[0]
摄影机上方向向量为[0 0 1]
,因此摄影机参考系和世界(对象)参考系相同。要将三维点映射为二维点,我有:
[x/z y/z 1]' = K * P * [X Y Z 1]'
其中[x/z y/z]
是使用齐次表示法位于[x y z 1]
处的3D点的像素坐标K
是3 x 4
校准矩阵(最后一列由零组成),而P
是4 x 4
投影矩阵
因为我还需要模拟校准过程,所以我使用加州理工学院的Matlab校准工具箱获得了K
,其中包含一个典型的国际象棋模式(这个也是在Matlab中构建的)<发现代码>K为:
K = [521 0 409 0;
0 521 288 0;
0 0 1 0]
其中焦距由相机视角设置,我使用的是使用命令print
拍摄的800x600
照片
这是我的问题:如果在3D视图中,我在轴的原点放置了一个标记,并使用放置在
[0-50-50]
的相机拍摄场景(例如)查看[0 0 0 0]
,如前所述,我在图片中找到了原点的像素坐标[415 290]
但是试图通过K*p*[0 0 0 1]
计算投影时,我得到了错误的结果,例如[409 811 1]
,其中X
几乎相同,但Y
是完全错误的(即使在图片边界之外)
K
由校准工具箱定义,p
由X轴上的旋转(本例中为45°)和[0-50-50]
处的平移定义
我做错了什么
以下是p
矩阵(如果有帮助):
投影矩阵被定义为K[R | T]=P,x=PX,所以方程x=KPX是错误的,但是如果这里的P是[R | T],那么你的计算是正确的(我不知道[415290]的事情)。轴原点的角度和平移是已知的,所以我认为唯一的误差源是矩阵K。“matlab焦距”是由摄像机视角设置的,我对校准模式的图像和对象的图像使用了相同的值,因此变焦没有改变,K应该相同。
P = [1 0 0 0;
0 0.707 -0.707 -50;
0 0.707 0.707 -50;
0 0 0 1]