我正在编写代码来模拟立体视觉,并发现了3D到2D映射的一些麻烦。我正在查看的对象是围绕轴原点构建的,并且摄像机目标设置为[0 0 0]
。
相机向上矢量为[0 0 1]
,因此相机参考系统和世界(物体)参考系统是相同的。要将3D点映射到2D点,我有:
[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
投影矩阵。
由于我还需要模拟校准过程,因此我使用Caltech的Matlab校准工具箱获得了K
的典型国际象棋模式(这也是在Matlab中构建的)。 K
被发现为:
K = [521 0 409 0;
0 521 288 0;
0 0 1 0]
其中焦距根据摄像机视角设置,并且我使用800 x 600
命令print
拍摄的照片。
这是我的问题:如果在3D视图中我在轴的原点放置了一个标记,并使用放置在[0 -50 -50]
(例如)的相机拍摄场景照片[0 0 0]
如前所述,我在图片中找到原点的像素坐标[415 290]
。
但是尝试通过K * P * [0 0 0 1]'
来计算投影我得到了错误的结果,例如[409 811 1]
其中X
几乎相同但是{{1}完全错误(甚至在图片边界之外)。
Y
由校准工具箱定义,K
由X轴(本例中为45°)和P
处的平移定义。
我做错了什么?
这是[0 -50 -50]
矩阵(如果它有帮助):
P