仿射变换和透视变换都是计算机视觉中重要的图像变换操作,然而也困扰了我很久,通过找寻很多资料总算大致弄明白了这两个变换。
仿射变换
旋转和平移都是仿射变换的特殊形式。
wiki详细解释: https://en.wikipedia.org/wiki/Affine_transformation
变换示例:
OpenCV中提供warpAffine函数用来实现仿射变换
该函数要求提供用来进行仿射变换的矩阵(2x3),如果不知道该变换矩阵,可以结合两幅图像上三对对应点利用 getAffineTransform 函数求得仿射变换矩阵。
OpenCV实现仿射变换官网介绍: https://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html#warp-affine
http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_geometric_transformations/py_geometric_transformations.html
透视变换
透视变换(也称为同态映射Homography或单应性) 的本质是将图像投影到一个新的视平面。仿射变换可以理解为透视变换的特殊形式。
数学表达式: https://www.cnblogs.com/liekkas0626/p/5262942.html
wiki详细解释: https://en.wikipedia.org/wiki/Homography
一幅图像就是一个像素坐标系下的各个带有像素值的坐标点,而透视变换可以理解为就是将一幅图像中的这些坐标点完成了一个坐标转换,将它们的坐标变换到了其他位置,从而实现了变换了图像视角的效果。因此,透视变换和相机标定等概念其实并没有什么内在关系。
在车道线检测中的“相机标定”过程,其实就是做了一个透视变换,即相机画面图像和一幅 假想的地面图像 这两幅图像之间的变换关系,所谓假想的地面图像,即将实际地面上各点距离(离车辆后轴中心点)按一个设定的尺度放到一张图像上(鸟瞰图),此时只要是在这个地平面上的点,通过透视变换都可以得到其在相机图像上的点的坐标。因为假想的是在地平面上的点做的透视变换,所以此时只有位于地平面上的物体,才具有真正的鸟瞰图像素值,投影到图像上才是正常的。
透视变换可以用透视变换矩阵完成,透视变换矩阵为3x3矩阵:
矩阵可以分块来看,T1表示图像线性变换(包括旋转和缩放)、T2表示图像平移,T3用于产生图像透视变换,a33一般为1。 透视变换矩阵一般有8个未知数,给定透视变换对应的四对像素点坐标,即可求得透视变换矩阵;反之,给定透视变换矩阵,即可对图像或像素点坐标完成透视变换,如下图所示:
无透视,不空间
http://www.fevte.com/tutorial-30341-1.html
仿射变换与透视变换的关系:
https://blog.csdn.net/u012590570/article/details/51355600
仿射变换需要 三组点 的对应关系,而透视变换需要 四组点 的对应关系,才可以分别求得仿射变换和透视变换的变换矩阵。
变换示例:
OpenCV中提供warpPerspective函数用来实现仿射变换
该函数要求提供用来进行透视变换的矩阵(3x3),如果不知道该变换矩阵,可以结合两幅图像上 四对对应点 利用 getPerspectiveTransform 函数求得透视变换矩阵。
https://stackoverflow.com/questions/10962228/whats-the-best-way-of-understanding-opencvs-warpperspective-and-warpaffine?rq=1
其他形象例子与代码: https://blog.csdn.net/Paulhappy/article/details/52143742
https://blog.csdn.net/u012590570/article/details/51355600
https://zhuanlan.zhihu.com/p/24591720
https://nikolasent.github.io/opencv/2017/05/07/Bird's-Eye-View-Transformation.html
透视变换在相机鸟瞰图中的应用:
https://marcosnietoblog.wordpress.com/2014/02/22/source-code-inverse-perspective-mapping-c-opencv/
https://dsp.stackexchange.com/questions/19907/is-it-possible-to-hack-camera-calibration-without-having-access-to-the-camera
https://stackoverflow.com/questions/15768651/generating-a-birds-eye-top-view-with-opencv
https://www.pyimagesearch.com/2014/08/25/4-point-opencv-getperspective-transform-example/