首页 > 代码库 > 摄像机模型,畸变模型及畸变图像的矫正

摄像机模型,畸变模型及畸变图像的矫正

有任何问题,请联系:luhan@mail.nankai.edu.cn.                                                                                                                 

                                                                                                                                                                                                                 

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

 摄像机模型,畸变模型及畸变图像的矫正

luhan@mail.nankai.edu.cn

1:文中所有图的符号标注并不统一,一切以正文部分公式为准。

摄像机模型:

分若干步骤实现:

1)     小孔成像映射: 

类似如上的小孔成像模型,重置一下摄像机坐标系位置,得如下小孔成像模型: 

上图中,小孔成像模型把空间坐标点(齐次坐标形式,最后多一项记为1)映射为距距摄像机坐标系平面位置为(单位为距离)的新平面上的点,其坐标描述为(齐次坐标形式,单位为距离)。映射关系描述如下:

2)     考虑主点偏移,转化为像素值: 

考虑主点偏移,转化为像素坐标值如下:

其中,,单位均为 距离/像素

3)     考虑像素坐标非矩阵因素: 

如上图,考虑像素坐标非矩阵因素后,像素坐标描述如下:

4)     整理如下:

其中,,均为摄像机内参矩阵中常见待标定参数,其单位均为 像素值。另外内参矩阵常用待标定参数包括主点位置。

注意:经常采用如下形式的坐标,记为归一化图像坐标(normalized image coordinates:                                                            

则此时有: 

归一化图像坐标的单位为1。其物理意义为:取一距离摄像机坐标系平面的位置为1的新平面(归一化图像平面,mormalized image plane),则表示坐标点在该平面上的映射点坐标。

5)     引入世界坐标系: 

考虑世界坐标系与相机坐标系的矩阵变换(平移变换和旋转变换),引入世界坐标系坐标后,有:                                                  

其中, 。

6)     最终小孔成像模型如下: 

该模型为线性模型。

7)     对于摄像机内参数标定过程:

已知 ,则小孔成像模型变换为:

其中,。

记为单应矩阵,则有:,为常见标定模型。

畸变模型成因:

径向畸变:原因是镜头不规整造成的,不能完全把摄像机等效为小孔的等比放大模型。

切向畸变:原因是安装时镜头和感光片不完全平行,引入的非线性成像。

关于畸变模型的理解:

我的理解是,小孔成像模型描述了一个线性模型(包括对安装时镜头和感光片不平行部分的描述,内参数K的K(1,2)),去拟合摄像机成像的真实模型。

但各种原因(包括镜头不规整和镜头与感光片不平行的问题)造成了成像的真实模型包括非线性部分,为了充分描述和拟合该非线性部分,引入了畸变模型。

畸变模型描述:

1)     畸变模型:

给模型加入的畸变部分全部是加入在归一化图像坐标上的:

(参考http://blog.csdn.net/pinbodexiaozhu/article/details/43374737 )

径向畸变模型如下:

其中畸变系数为,张正有标定法(网上有现成代码)等中有自动标出,采用的是LM非线性优化算法。但无考虑切向畸变。

切向畸变模型如下:

其中畸变系数为,张正有标定法中未标定,同时在Matlab较新版本自带的cameraCalibrator工具箱中有标出。(不知道采用什么优化方法?)

Matlab较新版本自带cameraCalibrator工具箱标定过程如下图所示:

可参考:http://blog.csdn.net/Loser__Wang/article/details/51811347

图像畸变校正:

现在的问题是:已标定出摄像机内参数模型、畸变模型(畸变系数),给定一幅畸变图像,如何矫正图像?

已有畸变图像,已知该图像上每一点坐标和像素值,目标是求得一幅去畸变图像,即求得该去畸变图像上的每一点坐标和像素值。常采用做法如下:

构造一个空图像(作为去畸变图像),针对每一点坐标,左乘内参矩阵 得归一化坐标,利用畸变模型得畸变的归一化坐标,再左乘内参矩阵得对应畸变坐标。由于求得的畸变坐标通常不为整数,需要在畸变图像上采用插值方法得到像素值,赋值给。即得到完整去畸变图像。

问题1不能实现,在畸变图像上选定一特征点,直接反向求取其在去畸变图像上的坐标。需要先利用插值方法获得整幅的去畸变图像,然后再提取特征点。

问题2对于径向和切向畸变模型,按照什么顺序什么方式叠加?

例:

采用网上找的例子:http://blog.csdn.net/Loser__Wang/article/details/51811347

摄像机内参数为:[445.0538, 0.1921, 327.1490; 0, 447.3691, 244.2735; 0, 0, 1]

径向畸变系数:[k1, k2] = [-0.3203, 0.1177].

切向畸变系数:[p1, p2] = [-0.0055, 0.0014].

假设图像分辨率为:640*480.(根据主点值猜测)

文中给出的待校正图像和矫正后图像,如下:

我在程序中仅考虑径向畸变,和先径向再切向畸变都矫正,得图:

可见,图像是得到了矫正,但显示范围变小了,不全了。原因是,我是截图得到的图片,不是文章采用的原始图片。

另外的问题是,自己的程序耗时较长,openCV现成函数应该有优化。

采用自己的摄像机,对已有图片去参数,结果如下,依次为:原图、仅矫正径向畸变图、均矫正图:

 

 

摄像机模型,畸变模型及畸变图像的矫正