Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab中三维坐标到像素坐标的转换_Matlab_3d_Mapping_2d - Fatal编程技术网

Matlab中三维坐标到像素坐标的转换

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

我正在编写模拟立体视觉的代码,发现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
投影矩阵

因为我还需要模拟校准过程,所以我使用加州理工学院的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]