opencv图片去畸变相关方法总结
Posted mazinkaiser1991
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv图片去畸变相关方法总结相关的知识,希望对你有一定的参考价值。
opencv中共提供三种去畸变方法,分别为:
cv2.undistort
cv2.omnidir.undistortImage
cv2.fisheye.undistortImage
第一种方法是opencv-python中自带的方法,后两种是opencv-contrib-python中的方法,因此还需要安装opencv-contrib-python包。
第一种方法适用于普通相机,第二种方法适用于全向摄像机,第三种方法适用于鱼眼相机。
cv2.undistort方法使用的基本流程如下:
1)调用cv2.getOptimalNewCameraMatrix函数获取新的相机内参,getOptimalNewCameraMatrix的输入参数为1、原始相机内参,2、畸变参数,3、图像原始尺寸,4、alpha值,5、去畸后的图片尺寸,6、centerPrincipalPoint,以上六个参数中5、6暂时未用到,其具体发挥的作用还不明确。1、2两个参数在相机出厂时已经明确不需要再额外计算,3为输入图片的原始尺寸也不要再额外计算。对于4参数,alpha为0时,经过去畸变的图片不包括任何黑边,alpha为1时,经过去畸变的函数包括黑边,alpha还可以设置0~1之间的值,其效果介于以上两种情况之间。
2)通过以上函数获取新相机内参后,再调用cv2.undistort即可实现对图片的去畸操作。
cv2.undistort函数实际是cv2.initUndistortRectifyMap与cv2.remap函数的组合。该函数的实现源码在4.x/modules/calib3d/src/undistort.dispatch.cpp中,对于单张图片直接调用cv2.undistort无任何性能问题,但是对于批量处理,仅调用cv2.initUndistortRectifyMap一次获得映射关系后,再只调用cv2.remap函数即可。cv2.undistort函数的问题在于只能保持与原图相同的长宽比,但是图像在去畸变后容易出现有效区域长宽比不同于原图长宽比的情况,因此使用cv2.undistort会造成有效区域的丢失。
cv2.omnidir.undistortImage函数的使用方法与cv2.undistort函数基本相同,但也有一些不一样的地方,cv2.omnidir并没有getOptimalNewCameraMatrix类似的方法,无法通过计算获得新的相机内参矩阵,根据OpenCV: Omnidirectional Camera Calibration中的描述,cv2.omnidir.undistortImage共有四种模式,每种模式对应一种对应的推荐相机内参,根据推荐的相机内参值填入相应数值即可。
cv2.fisheye.undistortImage的使用方法与cv2.undistort类似,存在一个estimateNewCameraMatrixForUndistortRectify计算新的相机内参,使用estimateNewCameraMatrixForUndistortRectify函数获得的新相机内参输入到cv2.fisheye.undistortImage中即可以获得去畸后的图片。与cv2.undistort类似,cv2.fisheye中同样存在一个initUndistortRectifyMap函数用于获得映射关系,然后再调用remap函数获得去畸变之后的结果。
以上是关于opencv图片去畸变相关方法总结的主要内容,如果未能解决你的问题,请参考以下文章