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] 值匹配。
对于无操作旋转矩阵应该是一个恒等式
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 是因为结果以齐次坐标返回=本质上是带有比例因子的二维坐标。