我在确定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]]
非常感谢任何帮助!