微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OpenCV摄像机校准-如何将来自多个图像的校准结果合并为一组校准参数?

如何解决OpenCV摄像机校准-如何将来自多个图像的校准结果合并为一组校准参数?

我第一次使用Python中的OpenCV执行摄像机校准。之前,我已经使用其他视觉套件进行了相机校准,所以我熟悉此过程。到目前为止,我已经遵循了本教程https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_calib3d/py_calibration/py_calibration.html,该教程非常有帮助。

如果我使用OpenCV从https://github.com/opencv/opencv/tree/master/samples/dataleft01.jpgleft14.jpg提供的示例棋盘图案校准图像,则上述教程中每个图像的结果都很好。

最后,按照上述要求,我先叫initUndistortRectifyMap,然后叫remapinitUndistortRectifyMap的输入是cameraMatrixdistCoeffsnewCameraMatrix。在以上教程中,分别针对每个图像left01.jpgleft14.jpg计算这3个变量,然后分别应用于每个图像left01.jpgleft14.jpg

对于实际的相机校准,我的印象是我需要对许多图像进行校准(对于生产级别的结果,可能需要50多个)。然后,在程序启动时,我将从某种类型的配置文件中加载cameraMatrixdistCoeffsnewCameraMatrix调用initUndistortRectifyMap获取map1和{{ 1}},然后每次获取新图像时,调用map2

我的问题是,将这三种数据结构中的remapcameraMatrixdistCoeffs的值从多个图像集中到一个设置中的标准方法是什么?在浏览50幅以上的图像时,我是否只是将newCameraMatrixcameraMatrixdistCoeffs的结果缓存在某种类型的变量中,然后对50幅图像中的每个值取平均值?这似乎是显而易见的方法,但是我想知道这是否是最好的方法,或者是否有必要使用更复杂的方法或将是有益的。

为使我的问题更具体,这里是上述教程的一些示例输出,我只是稍微更改了变量名并添加了一些打印语句。为简洁起见,我仅显示3个结果:

newCameraMatrix

获取最后的----------------------------------------------------- imageFileName = left04.jpg cameraMatrix = [[515.51273861 0. 341.23697124] [ 0. 515.48750138 234.27066711] [ 0. 0. 1. ]] distCoeffs = [[-2.04120057e-01 -1.03446509e+00 2.31949959e-03 -2.67680902e-03 5.40565638e+00]] newCameraMatrix = [[555.35675049 0. 320.32811234] [ 0. 496.67471313 235.04880727] [ 0. 0. 1. ]] ----------------------------------------------------- imageFileName = left03.jpg cameraMatrix = [[538.77944522 0. 338.46560887] [ 0. 537.75253881 229.53022945] [ 0. 0. 1. ]] distCoeffs = [[-0.31629594 0.33427194 0.00416541 -0.00153091 -0.51731552]] newCameraMatrix = [[396.84649658 0. 345.60440271] [ 0. 419.1550293 223.4569963 ] [ 0. 0. 1. ]] ----------------------------------------------------- imageFileName = left14.jpg cameraMatrix = [[530.89655954 0. 338.25309591] [ 0. 531.05459141 231.03714151] [ 0. 0. 1. ]] distCoeffs = [[-0.29627459 0.21262508 0.00140653 -0.0004961 -0.25326159]] newCameraMatrix = [[315.26034546 0. 309.90506623] [ 0. 324.63635254 200.73965265] [ 0. 0. 1. ]] cameraMatrixdistCoeffs(例如,对于newCameraMatrix),您需要平均cameraMatrix515.51273861,和538.77944522获得第一个530.89655954,平均cameraMatrix341.23697124338.46560887获得第三个338.25309591等等这些数据结构中的每一个中有多少?我再次意识到,对于任何制作,我都会使用超过3张图像。

解决方法

我认为您不想多次调用校准函数。您想调用一次校准过程,并找到适合许多图像的最佳参数优化。因此,您只会得到一个相机矩阵/距离系数,因此不必求平均值。更准确地说,如果您使用的是:
ret,mtx,dist,rvecs,tvecs = cv2.calibrateCamera(objpoints,imgpoints,gray.shape[::-1],None,None)
您必须在objpoints和imgpoints中获得与图像一样多的行。根据您的问题,我假设您只有一对objpoints / imgpoints。

“ newCameraMatrix”的目的是定义重新采样后可见的区域。如果要查看所有图像像素,并且有未定义的黑色区域(例如,由于镜头变形),或者要裁剪图像,以便所有像素在重映射后都包含一些图像数据。因此,建议存储cameramatrix,并在生产程序中计算newcameramatrix,以便您可以轻松地与alpha参数交互。与修改后的相机矩阵相比,存储Alpha更好。
我希望这能回答您的问题!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。