OpenCV特征点检测匹配图像-----添加包围盒

仿射变换

一般对图像的仿射变换分为
旋转,缩放,错切,平移。旋转要确定旋转中心,首先要将旋转中心转移到原点,然后再进行缩放和旋转。详见这里(这个文章中的变换矩阵推导部分错误,顺时针的旋转矩阵表示不正确,opencv的文档表示无误) 但是单纯的只进行错切平移时,则要先将图像的中心转移到图像的左上角原点,进行完变换后,再转移回到中心。

仿射变换的两种实现形式:1,指定三对点,利用getAffineTransform(src_point, dst_point)函数获得变换矩阵

2,对于旋转和缩放的变换,可以利用getRotationMatrix2D(center,
angle, scale)函数获得变换矩阵。而对于其他的单纯的只进行错切平移时,则要自己写变换矩阵,而且还要配合缩放,不然原始的图像大小不能放下变换后的图像,超出的部分就不会进行显示。而且必要时还要调整变换后图片的位置。其实旋转,不在乎绕着哪个点进行,无非是变换后的图像的位置不同而已,通过平移可以完全重合。

最后,得到了变换矩阵,然后利用warpAffine(image, warpimage, warp_mat, warpimage.size());得到变换后的图像。参考这里

透视变换

就是相机在不同位姿下对同一平面的不同显示情况。透视变换对应了单应矩阵,这个单应矩阵可以近似的表达相机的旋转矩阵R(相机只存在微小平移时)?待验证。

参考1

参考2

单应矩阵

在slam中的应用:there

这里说的单应性矩阵主要是指平面单应性矩阵,在三轴坐标中XYZ,Z=1这个有点类似于三维的齐次坐标。单应性矩阵主要用来解决两个问题,

一是表述真实世界中一个平面与对应它图像的透视变换

二是从通过透视变换实现图像从一种视图变换到另外一种视图

参考there

透视变换其实是表示的三维与二维点之间的对应投影关系,而单应矩阵为什么可以表示两个图像二维坐标之间的关系呢?这个单应矩阵实际上不等于旋转矩阵R,也不是一定在没有平移运动的时候才可以使用。但是为什么要求单应矩阵的点必须是同一平面呢?

以下为推断,待验证:

实际上,单应矩阵类似于本质矩阵F,这个单应矩阵也可以分解出R t;但是,由于需要找到平面,不太好操作,所以不怎么使用。只有当不存在平移运动,对极几何不稳定时,才使用单应矩阵H。