通过重映射来表达每个像素的位置
:

这里
是目标图像,
是源图像,
是作用于
的映射方法函数.想象一下我们有一个图像
,
我们想满足下面的条件作重映射:
,图像会按照
轴方向发生翻转.
|
1
2
3
4 |
map_x.create( src.size(), CV_32FC1 );map_y.create( src.size(), CV_32FC1 );/* 计算map_x与map_y */remap( src, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0,0, 0) ); |
的第一个参数map_x与map_y分别代表目标图中的(x,y)点在原图中的x坐标(由map_x提供)与y坐标(由map_y提供)。
仿射变换本质是一个2*3的矩阵M乘上原图的每个坐标,得到目标图的对应点坐标。2*3矩阵M中的2表示目标点坐标的x与y,3中的第三维是平移分量。因此需要做的就是找到矩阵M,OpenCV提供 getAffineTransform 求出仿射变换, getRotationMatrix2D 来获得旋转矩阵。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 |
Point2f srcTri[3];Point2f dstTri[3];Mat rot_mat( 2, 3, CV_32FC1 );Mat warp_mat( 2, 3, CV_32FC1 );Mat src, warp_dst, warp_rotate_dst;// 1. 找到对应点:原点+目标点srcTri[0] = Point2f( 0,0 );srcTri[1] = Point2f( src.cols - 1, 0 );srcTri[2] = Point2f( 0, src.rows - 1 );dstTri[0] = Point2f( src.cols*0.0, src.rows*0.33 );dstTri[1] = Point2f( src.cols*0.85, src.rows*0.25 );dstTri[2] = Point2f( src.cols*0.15, src.rows*0.7 );// 2. 获得用以描述仿射变换的 2 x 3 矩阵 (在这里是 warp_mat)warp_mat = getAffineTransform( srcTri, dstTri );// 3. 将刚刚求得的仿射变换应用到源图像warpAffine( src, warp_dst, warp_mat, warp_dst.size() );// 1. 设置旋转参数Point center = Point( warp_dst.cols/2, warp_dst.rows/2 );//旋转图像所要围绕的中心double
angle = -50.0;// 旋转的角度. 在OpenCV中正角度是逆时针的double
scale = 0.6;//可选择: 缩放因子// 2. 获得旋转矩阵, 这个函数返回一个 2 x 3 矩阵 (这里是 rot_mat)rot_mat = getRotationMatrix2D( center, angle, scale );// 3. 映射输出warpAffine( warp_dst, warp_rotate_dst, rot_mat, warp_dst.size() ); |
OpenCV学习笔记(九) 重映射、仿射变换,布布扣,bubuko.com
原文:http://www.cnblogs.com/ericxing/p/3580104.html