为什么 cv2.projectPoints 的行为不符合我的预期?

Phi*_*yes 3 python opencv numpy

我有一个 3D 世界,我试图使用 cv2.projectPoints 将其映射到 2D 视图,但它没有按我的预期运行。我对 opencv、numpy 和矩阵运算的掌握很弱,所以我一定在某个地方做出了错误的假设。这段代码:

src = np.ones((6, 3))
src[:,1] = 2
src[:,2] = range(6) # source points
rvec = np.array([0,0,0], np.float) # rotation vector
tvec = np.array([0,0,0], np.float) # translation vector
fx = fy = 1.0
cx = cy = 0.0
cameraMatrix = np.array([[fx,0,cx],[0,fy,cy],[0,0,1]])
result = cv2.projectPoints(src, rvec, tvec, cameraMatrix, None)
for n in range(len(src)):
    print src[n], '==>', result[0][n]
Run Code Online (Sandbox Code Playgroud)

生成此输出:

[ 1.  2.  0.] ==> [[ 1.  2.]]
[ 1.  2.  1.] ==> [[ 1.  2.]]
[ 1.  2.  2.] ==> [[ 0.5  1. ]]
[ 1.  2.  3.] ==> [[ 0.33333333  0.66666667]]
[ 1.  2.  4.] ==> [[ 0.25  0.5 ]]
[ 1.  2.  5.] ==> [[ 0.2  0.4]]
Run Code Online (Sandbox Code Playgroud)

x 值和 y 值除以 z 值?!我认为,由于我没有对 rvec 和 tvec 进行任何转换,因此输出应该与 src 的 [x,y] 值匹配。

Mar*_*ett 5

对于无操作旋转矩阵应该是一个恒等式

1 0 0
0 1 0
0 0 1
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个非常简单的函数,可以自己编写。

foreach input 3dpoint xyz
  3dpoint tmp = cameraintrinsic(3x3) * rotationvect(1x3) * xyz(3x1) + cameraintrinsic(3x3)*translation(3,1)
  2dpoint screen = tmp.x/tmp.z, tmp.y / tmp.z
Run Code Online (Sandbox Code Playgroud)

/tmp.z 是因为结果以齐次坐标返回=本质上是带有比例因子的二维坐标。