OpenCV:重映射remap vs仿射变换warpAffine( 二 )


       return 0;
}
【注】:
map_x和map_y:代表方针图中的(x,y)点在原图像的x坐标和y坐标;

OpenCV:重映射remap vs仿射变换warpAffine

文章插图

3仿射变换:
仿射变换是一个标的目的量空间进行一次线性变换并接上一个平移 , 变换为另一贯量空间的过程;
图像进行仿射变换后的特点:
①二维图像之间的相对位置关系连结不变 , 平行线依旧是平行线 , 且直线上的点的位置挨次连结不变;
②一个肆意的仿射变换都可以暗示为乘以一个矩阵(线性变换)接着再加上一个标的目的量(平移)的形式;
三种常见形式:
扭转-rotation(线性变换)
平移-translation(标的目的量加)
缩放-scale(线性变换)

OpenCV:重映射remap vs仿射变换warpAffine

文章插图

4仿射变换流程:
仿射变换素质是一个2* 3的矩阵M乘上原图的每个坐标 , 获得方针图的对应点坐标 。
2*3矩阵M中的2暗示方针点坐标的x与y , 3中的第三维是平移分量 。
是以需要做的就是找到矩阵M;
OpenCV供给 getAffineTransform 求出仿射变换 ,
getRotationMatrix2D 来获得扭转矩阵 。
这里简单说说仿射变换是怎么做到的 。
如下有两幅图像 , 图像二是图像一颠末放射转变得来的 。
那问题来了 , 我们怎么从这两个图像信息里挖掘出两图之间的映射关系?
只要在图像一种拿出三个点(1,2,3) ,
图像二也拿出对应的三个点(1,2,3) ,
就可以求出两图间的映射关系!

OpenCV:重映射remap vs仿射变换warpAffine

文章插图

5法式1
OpenCV经由过程两个函数的组合利用来实现仿射变换:
利用warpAffine来实现简单重映射
利用getRotationMatrix2D来获得扭转矩阵
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\features2d\features2d.hpp>
#include <opencv2\core\core.hpp>
using namespace std; 
using namespace cv; 
//仿射变换尝试
int main()
{
       Mat src = https://vvvtt.com/article/imread("0.jpg");
       Mat dst_warp, dst_warpRotateScale;
       Point2f srcPoints[3];//原图中的三点 
       Point2f dstPoints[3];//方针图中的三点 
       //第一种仿射变换的挪用体例:三点法
       //三个点对的值,只要知道变换后图的三个点坐标 , 就可实现仿射变换 
       srcPoints[0] = Point2f(0, 0);
       srcPoints[1] = Point2f(0, src.rows - 1);
       srcPoints[2] = Point2f(src.cols - 1, 0);
       //映射后的三个坐标值
       dstPoints[0] = Point2f(0, src.rows*0.3);
       dstPoints[1] = Point2f(src.cols*0.25, src.rows*0.75);
       dstPoints[2] = Point2f(src.cols*0.75, src.rows*0.25);
       Mat M1 = getAffineTransform(srcPoints, dstPoints);//计较变换矩阵 

推荐阅读