玩过手机摄影的小伙伴都有这样的体会:有的时候照片会拍歪;还有时会因为视野的缘故,无法拍到眼前的完整图像,无法还原美景。这些在计算机视觉中,其实都有解决方案,而方案的核心,就是我们需要介绍的投影几何。 老规矩,还是先了解些基本概念:
一、矩阵变换
矩阵变换有多种:比如旋转、平移、剪切、尺度变换、透视投影…,两个坐标系之间的运动由一个旋转加上一个平移组成,若同一个向量在各个坐标系下的长度和夹角都不会发生变化,则这种运动称为刚体运动。刚体运动前后的两个坐标系相差一个欧式变换。除了欧式变换之外,还有其它的变换,汇总如下:
- 欧式变换:保持向量的长度和夹角,包括旋转和平移。
- 相似变换:比欧式变换多了一个缩放因子_s_,可以在旋转之后进行缩放。
- 仿射变换:仿射变换要求A是是一个可逆矩阵,而不一定是正交矩阵。经过仿射变换后,立方体可能会变成斜的,但是各个面仍然是平行四边形。
- 射影变换:射影变换是最一般的变换,左上角为可逆矩阵A,右上角为平移t,左下角为缩放v。
二、投影几何概览
聊完投影几何,自然而然就会想起单应性变换:是一个平面内的点映射到另一个平面内的二维投影变换。
三、单应性变换
1. 什么是单应性?
相机从不同位置拍摄同一物体,图像之间存在单应性。
简单而言,如下方数学表达式:
2. 单应性矩阵如何求解?
对于透视变换,H矩阵有8个自由度,这样至少需要4对特征点对求解,4个特征点对可以建立8个方程。
3.实例:平面单应性估计
1)未知:平面单应性(8自由度) 2)已知:点对(x_1, x_1^,),…,(x_n,x_n^,) 3)限制条件:n x 投影矩阵 x_i^, = Hx_i 4)解决方法(n≥4)→ 4特征点算法
- OpenCV函数:
cv::getPerspectiveTransform() 和 cv::findHomography()
- 其它变换需要更少数量的对应点:
- 仿射变换($n≥3$),相似性变换($n≥2$),欧式变换($n≥2$)
5)【注意事项】平面单应性可以被分解为相机相对位姿
- OpenCV函数:
cv::decomposeHomographyMat()
- 但是,分解需要知道相机矩阵
单应性在计算机视觉领域是一个非常重要的概念,它在图像校正、图像拼接、相机位姿估计、视觉SLAM等领域有非常重要的作用。有了前面的概念做基础,我们看下以下3个例子:
例子#1:图像校正
透视变换对畸变图像的校正需要取得畸变图像的一组4个点的坐标,和目标图像的一组4个点的坐标,通过两组坐标点可以计算出透视变换的变换矩阵,之后对整个原始图像执行变换矩阵的变换,就可以实现图像校正。
以下是部分代码及执行结果:
例子#2: 平面图像配准
图像配准是找到一幅图像像素到另一幅图像像素间的空间映射关系。这些图像可以是不同时间(多时间配准),不同传感器在不同地方拍摄(多模式配准)。
以下是部分代码及执行结果:
例子#3: 二维视频稳像
视频稳定(简称稳像),是指利用相关的算法,对视频设备采集的原始视频序列进行处理,去除其中的抖动。视频稳像的目的,一方面是为了让人眼观感舒适,有利于人工观测、判别等,另一方面也作为诸多其他后续处理的预处理阶段,如检测、跟踪和压缩。 稳像按作用机制分为光学、机械和电子稳像。
- 光学稳像通过主动光学部件自适应调整光路,补偿由于摄像平台抖动造成的图像运动,达到稳定图像的的目的;
- 机械稳像通过陀螺传感器等器件检测摄像平台的抖动,然后对伺服系统进行调整而达到稳定图像的目的;
- 视频稳像基于在连续视频图像之间进行运动估计,然后对视频中的每一帧图像进行运动滤波和运动补偿处理得到稳定的图像。
针对于视频稳像技术而言,由于相邻两帧图像的间隔很短,几乎没有扭转变化,所以一般采用平移、旋转加缩放的模型对其运动进行建模。