既然用cv2.calibrateCamera()求解得到的相机内参有可能会不满足实际情况,根据相机投影过程,如果固定相机内参为理论值,那么这样的话求出的相机外参应该会变化,但还是能保证可以实现重投影的过程。这里想的是参考opencv的cv2.solvePnP和cv2.solvePnPRansac()函数(前面已经发现cv2.calibrateCamera()只是会把传入的内参矩阵作为初始化的位置开始求解)。
opencv中的设置:
cv2.solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs[, rvec[, tvec[, useExtrinsicGuess[, flags]]]]) → retval, rvec, tvec
cv2.solvePnPRansac(objectPoints, imagePoints, cameraMatrix, distCoeffs[, rvec[, tvec[, useExtrinsicGuess[, iterationsCount[, reprojectionError[, minInliersCount[, inliers[, flags]]]]]]]]) → rvec, tvec, inliers
具体可以参考https://blog.csdn.net/qq_30815237/article/details/87606687
测试了一下这两个函数的计算结果,对于某些角度和位移,发现虽然solvePnPRansac应该对异常值有更好的鲁棒性,但我这里输入的2D,3D点坐标的人为生成的理论值,理论上不应该出现差距这么大的结果,看来一下inliers发现有些点是不被计算在模型里面的,暂时没搞清楚原因。在用的时候需要考虑一下inliers的数量和输入点的数量的差距,还有重投影的误差。
Camera calibration With OpenCV — OpenCV 2.4.13.7 documentation