首页 > 代码库 > 摄像机模型,畸变模型及畸变图像的矫正
摄像机模型,畸变模型及畸变图像的矫正
有任何问题,请联系:luhan@mail.nankai.edu.cn.
摄像机模型,畸变模型及畸变图像的矫正
luhan@mail.nankai.edu.cn
注1:文中所有图的符号标注并不统一,一切以正文部分公式为准。
l 摄像机模型:
分若干步骤实现:
1) 小孔成像映射:
类似如上的小孔成像模型,重置一下摄像机坐标系位置,得如下小孔成像模型:
上图中,小孔成像模型把空间坐标点(齐次坐标形式,最后多一项记为1)映射为距距摄像机坐标系平面位置为(单位为距离)的新平面上的点,其坐标描述为(齐次坐标形式,单位为距离)。映射关系描述如下:
2) 考虑主点偏移,转化为像素值:
考虑主点偏移,转化为像素坐标值如下:
其中,,单位均为 距离/像素。
3) 考虑像素坐标非矩阵因素:
如上图,考虑像素坐标非矩阵因素后,像素坐标描述如下:
4) 整理如下:
其中,,均为摄像机内参矩阵中常见待标定参数,其单位均为 像素值。另外内参矩阵常用待标定参数包括主点位置。
注意:经常采用如下形式的坐标,记为归一化图像坐标(normalized image coordinates):
则此时有:
归一化图像坐标的单位为1。其物理意义为:取一距离摄像机坐标系平面的位置为1的新平面(归一化图像平面,mormalized image plane),则表示坐标点在该平面上的映射点坐标。
5) 引入世界坐标系:
考虑世界坐标系与相机坐标系的矩阵变换(平移变换和旋转变换),引入世界坐标系坐标后,有:
其中, 。
6) 最终小孔成像模型如下:
该模型为线性模型。
7) 对于摄像机内参数标定过程:
已知 ,则小孔成像模型变换为:
其中,。
记为单应矩阵,则有:,为常见标定模型。
l 畸变模型成因:
径向畸变:原因是镜头不规整造成的,不能完全把摄像机等效为小孔的等比放大模型。
切向畸变:原因是安装时镜头和感光片不完全平行,引入的非线性成像。
l 关于畸变模型的理解:
我的理解是,小孔成像模型描述了一个线性模型(包括对安装时镜头和感光片不平行部分的描述,内参数K的K(1,2)),去拟合摄像机成像的真实模型。
但各种原因(包括镜头不规整和镜头与感光片不平行的问题)造成了成像的真实模型包括非线性部分,为了充分描述和拟合该非线性部分,引入了畸变模型。
l 畸变模型描述:
1) 畸变模型:
给模型加入的畸变部分全部是加入在归一化图像坐标上的:
(参考http://blog.csdn.net/pinbodexiaozhu/article/details/43374737 )
径向畸变模型如下:
其中畸变系数为,张正有标定法(网上有现成代码)等中有自动标出,采用的是LM非线性优化算法。但无考虑切向畸变。
切向畸变模型如下:
其中畸变系数为,张正有标定法中未标定,同时在Matlab较新版本自带的cameraCalibrator工具箱中有标出。(不知道采用什么优化方法?)
Matlab较新版本自带cameraCalibrator工具箱标定过程如下图所示:
可参考:http://blog.csdn.net/Loser__Wang/article/details/51811347
l 图像畸变校正:
现在的问题是:已标定出摄像机内参数模型、畸变模型(畸变系数),给定一幅畸变图像,如何矫正图像?
已有畸变图像,已知该图像上每一点坐标和像素值,目标是求得一幅去畸变图像,即求得该去畸变图像上的每一点坐标和像素值。常采用做法如下:
构造一个空图像(作为去畸变图像),针对每一点坐标,左乘内参矩阵 得归一化坐标,利用畸变模型得畸变的归一化坐标,再左乘内参矩阵得对应畸变坐标。由于求得的畸变坐标通常不为整数,需要在畸变图像上采用插值方法得到像素值,赋值给。即得到完整去畸变图像。
问题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现成函数应该有优化。
采用自己的摄像机,对已有图片去参数,结果如下,依次为:原图、仅矫正径向畸变图、均矫正图:
摄像机模型,畸变模型及畸变图像的矫正