镜头畸变矫正

五、畸变矫正—让世界不在扭曲

          这篇博文所要讲述的内容,是标定的主要用途之一:矫正摄像机的畸变。对于图像畸变矫正的方法,张正友教授也在其大作“A Flexible New Technique forCamera Calibration”中给出。

         玉米在这里先为大家介绍一下,摄像机畸变主要有哪几种以及这些讨厌的畸变从何而来。

摄像机畸变主要包含:镜像畸变、切向畸变。玉米在这里分别讲述一下,并引用一些图片,使大家对他们有一个直观的认识。

         1.径向畸变:产生原因是光线在远离透镜中心的地方比靠近中心的地方更加弯曲径向畸变主要包含桶形畸变和枕形畸变两种。下面两幅图是这两种畸变的示意:


          它们在真实照片中是这样的:

           2.切向畸变:产生的原因透镜不完全平行于图像平面,这种现象发生于成像仪被粘贴在摄像机的时候。下面图片来自于《学习opencv》p413。

          畸变矫正,首先应该知道畸变系数,然后做与畸变相反的变换,消除畸变。

          张氏标定法中只关注径向畸变。我们是按照张氏标定,计算畸变系数的。那么,下面让我们来看一下径向畸变的数学表达。

          因为在实际情况下,径向畸变较小,所以其可以用主点(principle point)周围的泰勒级数展开的前几项进行描述。张氏标定法,利用前两项来确定径向畸变的畸变系数。数学表达式如下:

其中,代表理想无畸变的像素坐标,代表实际径像畸变的情况下的像素坐标,代表主点,代表理想无畸变时的连续图像坐标,代表实际径像畸变的情况下的连续图像坐标。K1,k2代表前两阶的畸变参数。。

         那么对于图像上的任意一点,我们有两个个等式。化成矩阵形式:


        通过前面两篇博文所介绍的内容,求得的摄像机模型,我们可以计算出(可通过摄像机模型直接解出)、(与是否畸变无关,直接在已求得的内参阵中得到)、(即直接读取的有畸变的像素坐标),(由摄像机模型可以通过物体的世界坐标点解出)。那么,两个方程两个未知数,我们用一点就可以求的径向畸变了。因为我们有n张图片,每张图片上有m个点,所以我们可以得到2mn个等式。运用最小二乘法对结果进行优化。可用下式解径向畸变k=[k1,k2]。

其中,D等式左边的方程的系数矩阵,d是等式右边的有畸变的像素坐标与无像素坐标之差构成的矩阵。有上式,一步到位,计算出畸变系数。

       但是,但是,大家先别急。我们的参数求解之路还没有结束。为了使标定得到的估算实际的、存在径向畸变的摄像机参数。我们需要把,刚刚求解得到的畸变参数,连同前面得到的理想无畸变条件下的内外参数一起,进行极大似然估计。

       这里的极大似然估计方法与上一篇博文《极大似然参数估计》相同,玉米在这里就不在赘述。

依然是以最小化下列函数为目标,只不过此次参数估计中又多加了k1,k2:

        然后,仍然用Levenberg-Marquardt算法进行计算。最终就得到了,我们想要在考虑畸变情况下,摄像机的参数。

张氏标定,大功告成!

       下面让我们矫正畸变:

        就是这样一个简单的公式,就完成了畸变矫正。代表矫正畸变后的像素坐标,代表实际径像畸变的情况下的图像的像素坐标。

        最后给大家展示两幅图,让大家看一下畸变矫正的成果:

### Halcon 中畸变系数的使用方法及参数说明 在 Halcon 中,畸变系数用于描述镜头成像过程中的几何失真情况。这些系数对于图像处理和计算机视觉应用至关重要,因为它们能够帮助修正由透镜引起的图像变形。 #### 参数定义与分类 根据不同的相机模型,在 Halcon 中可以配置不同数量的畸变系数: - 对于 `area_scan_division` 类型的相机模型,通常只需要七个参数来表示基本的内部参数以及简单的径向畸变项[^3]。 ```cpp CameraParameters := ['area_scan_division', f, k, cell_width, cell_height, cx, cy, image_width, image_height] ``` - 如果选择了更复杂的 `area_scan_polynomial` 模型,则会引入额外的高阶径向畸变项 (k1, k2, k3) 和两个切向畸变项 (p1, p2)。 ```cpp CameraParameters := ['area_scan_polynomial', f, k1, k2, k3, p1, p2, cell_width, cell_height, cx, cy, image_width, image_height] ``` 其中, - **f**: 表示焦距; - **cx**, **cy**: 图像中心坐标; - **cell_width**, **cell_height**: 像素尺寸; - **image_width**, **image_height**: 成像区域大小; - **k/k1-k3**: 径向畸变系数; - **p1-p2**: 切向畸变系数; 需要注意的是,Halcon 的畸变系数计算方式不同于 OpenCV 等其他库。具体来说,两者之间存在方向上的差异——即一个是从前向后的映射关系,另一个是从后向前的逆变换关系[^1]。 #### 实际操作指南 为了获取并利用这些畸变系数来进行后续处理工作,可以通过调用特定函数完成相应任务。例如,通过执行 `calibrate_cameras` 函数可以获得完整的内外部参数集,其中包括了上述提到的各种畸变因子[^4]。 ```hdevelop * 执行相机标定流程... gen_calib_data ('default', [], 'circle_grid', [rows], [cols], CalibDataID) add_calib_data_camera (CalibDataID, ...) grab_image_and_pose (... , Pose) calibrate_cameras ([...], [...], ..., CamParam) * 输出结果中包含了详细的畸变信息 disp_message(WindowHandle,'Distortion parameters: '+CamParam,'window','true') ``` 此代码片段展示了如何创建校准数据对象、添加摄像机信息、采集样本图片及其姿态,并最终获得经过优化调整后的全部内参矩阵(含畸变系数)。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值