本系列的最后一篇,关于相机校正的内容。这一块原理和之前的介绍完全相同,需要两个步骤:将世界坐标下的位置转为相机坐标下对应的位置,然后进一步将该位置转为2D平面,对应最后的照片。前者对应上一篇中的
模型视图矩阵,在视觉中称为extrinsic parameters:
后者对应上一篇的
,在视觉中称为intrinsic parameters。
实际中,并没有远近裁剪面的概念,也不需要将2D坐标缩放至
,假设存在一个image plane来成像,存在矩阵
满足该投影转换。假设
是图片的中心点,f为焦距,同样基于相似三角形,可得:
实际中,焦距在x方向和y方向上可能不相同,甚至两个轴并不垂直,上图所示,
称为skew coefficient。考虑如上实际情况,得到一般解:
这样,我们实现了到相机像素坐标位置的转换关系,是以
的像素数。如何获取相机对应的extrinsic和intrinsic· parameters,这就是相机校正要做的事情。
我们会用一个黑白棋盘来进行校正,因为其黑白分明,格子的距离相等,且在一个平面上。棋盘左上角的第一个角默认为原点,确定x,y的方向,z是叉乘的方向。
如上图,是OpenCV校正时的过程,识别格子的角点。通常,提供更多的校正图片,最终得到的结果就越准确,误差也就越小。这里,我截取了十张校正图片进行校正,最终获取相机对应的参数。这个过程称为offline。
OpenCV校正后会生成一个out_camera_data.yml文件,其中最重要的信息是camera_matrix和distortion_coefficients。前者是一个
矩阵,也就是相机的intrinsic parameters
:
我笔记本摄像头对应的参数
这样,在online阶段,我们可以基于原点
,构建世界坐标系下的某个物体,OpenCV会实时根据原点的位置计算对应的extrinsic parameters
,这样,就可以在摄像头下huizhi 一些自定义的几何对象,这也是图像增强技术的基本原理。
上图是截取视频的一帧,基于offline中的K和distortion_coefficients,在online阶段实时的获取世界坐标系下的原点位置和XYZ轴,分别对应红色,绿色和蓝色,以及extrinsic参数(R,t),最终绘制正方体和随时间旋转的锥体
Distortion又是几个意思呢。这是因为真实的相机并不是pinhole,而是滤镜,如下图所示。等角滤镜会产生radial distortion的现象。所以需要进行纠偏操作。
通常,纠偏至少需要四个参数
,
对应下图中tangential distortion系数。
OpenCV中提供了五个参数,顺序为
,对应的纠偏算法为,可以调用projectPoints实现:
关于该系列,正如本系第一篇所述,一直想梳理一下这块的内容,但懒得开头,无意看到某位同事提了齐次坐标,以此为契机,算是完成了一个小小的夙愿,尽管我也清楚很多地方写的很仓促。写到这,想起来一本关于数学家的小册子 ’Heroes in my heart’,十年过去了,对作者在最后一段的感慨还能记住大半。
至此,完成了坐标系与矩阵系列。关于坐标系,不妨看看相对论(我也只是科普水平),当我们把时间也作为坐标系中的一个维度,可能会有新的体会;关于矩阵,分享一下黑客帝国1中,Morpheus说的一句话:’unfortunately, no one can be told what the Matrix is. You have to see it for yourself’。一个有理想的人,难免在某些时候活的很累,愿你永远无忧无虑,愿你爱的人懂得温暖来自何方。
听一首憨人,就睡了,又是一个不眠的夜晚~
参考资料:https://ww2.mathworks.cn/help/vision/ug/camera-calibration.html
INFOMCV computer vision