在使用aruco标记进行姿态估计时,应该使用cv2.calibrateCamera()得到的原始内参矩阵,而不是cv2.getOptimalNewCameraMatrix()去畸变后的内参矩阵。
理由如下:1. aruco.estimatePoseSingleMarkers()函数需要传入原始的相机内参矩阵,也就是没有做过去畸变操作的内参矩阵。这个内参矩阵会用于标记检测时计算标记在图像中的坐标。
2. cv2.getOptimalNewCameraMatrix()得到的内参矩阵是经过去畸变操作的,坐标已经变换到了去畸变后的图像平面上。这个内参矩阵不适合直接用于aruco的姿态估计。
3. 标记检测后的坐标还是在原始图像上,需要使用原始相机内参矩阵把它们转换到相机坐标系中,然后再与标记的真实尺寸比较来估计外参。
4. 一般流程是先检测标记获取2D坐标,然后使用原内参矩阵计算标记在相机坐标系中的3D坐标来恢复姿态。
所以正确的方法是:使用cv2.calibrateCamera()估计得到的原始内参矩阵作为aruco.estimatePoseSingleMarkers()函数的内参矩阵参数,才能进行正确的姿态估计。
在姿态估计时,应该继续使用原始内参矩阵self.mtx,而只在需要去畸变显示时才使用new_camera_mtx