不了解如何获取cv2.solvepnp对象点

时间:2018-04-20 00:05:24

标签: python python-2.7 opencv perspectivecamera

我在确定cv2.solvePnP()函数中的对象坐标点时遇到了一些困惑。这就是我想要做的。我在一个对象上有一个qrcode,我知道qrcode的确切宽度和高度。我也有代码将检测qrcode并发回qrcode的边界框坐标((x,y)值的4个点)。我现在想根据这些信息确定相机相对于qrcode的3D旋转和平移矩阵。

我的想法是使用cvs.solvePnP来确定矩阵。所以我有我的imagePoints作为从qrcode检测返回的边界框(4 x,y点),我有我的相机矩阵,我有我的失真矩阵。最大的问题是,如何获得对象(即世界)坐标?

有人认为,x和y对象点是现实生活中qrcode的宽度和高度(因为我知道打印的qrcode的确切大小)?但是,由于相机将在z轴的不同点上下移动,z会是什么?或者我只是组成一个随机物体坐标系?

也许我完全误解了这个功能?到目前为止,我有以下代码,现在我只是组成一个随机对象坐标系。但有了这个,我不确定如何解释结果。

image_points = np.array([(294, 136),(292, 211),(372, 209),(371, 132)], dtype="double")

# 3D model points.
model_points = np.array([(0.0, 0.0, 0.0),(0.0, 1.0, 0.0), (1.0, 0.0, 0.0),(1.0, 1.0, 0.0)])

# Camera internals
focal_length = 349.298
camera_matrix = np.array([[focal_length, 0, 356.177],[0, focal_length, 192.877],[0, 0, 1]], dtype = "double")

dist_coeffs = np.array([-0.169513, 0.0218559, 0, 0])

(success, rotation_vector, translation_vector) = cv2.solvePnP(model_points, image_points, camera_matrix, dist_coeffs, flags=cv2.SOLVEPNP_ITERATIVE)

rotM = cv2.Rodrigues(rotation_vector)[0]
cameraPosition = -np.matrix(rotM).T * np.matrix(translation_vector)

我的结果:

Camera Matrix :
 [[ 349.298    0.     356.177]
 [   0.     349.298  192.877]
 [   0.       0.       1.   ]]
Distortion Matrix:
 [-0.169513   0.0218559  0.         0.       ]
Rotation Vector:
 [[-0.10001903]
 [ 1.49954593]
 [ 0.15751248]]
Translation Vector:
 [[-0.06344466]
 [-0.33651584]
 [ 0.49100172]]
rotM: [[ 0.06377104 -0.16581526  0.98409276]
 [ 0.04228612  0.98566325  0.16333966]
 [-0.99706827  0.03119712  0.06986845]]
cam position: [[ 0.50783811]
 [ 0.30585336]
 [ 0.08309628]]

非常感谢任何帮助!

0 个答案:

没有答案