相机成像矩阵以及畸变相关介绍

成像矩阵

相机成像矩阵以及畸变相关介绍_第1张图片

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
相机成像矩阵以及畸变相关介绍_第2张图片
相机成像矩阵以及畸变相关介绍_第3张图片

非线性畸变

相机成像矩阵以及畸变相关介绍_第4张图片

相机成像矩阵以及畸变相关介绍_第5张图片

相机成像矩阵以及畸变相关介绍_第6张图片

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函数获得去畸变之后的结果。

对应源码文档:
相机成像矩阵以及畸变相关介绍_第7张图片

相机成像矩阵以及畸变相关介绍_第8张图片
opencv-doc:https://docs.opencv.org/4.5.5/db/d58/group__calib3d__fisheye.html#ga167df4b00a6fd55287ba829fbf9913b9

你可能感兴趣的:(计算机视觉)