OpenCV学习笔记(九) 重映射、仿射变换
重映射
通过重映射来表达每个像素的位置 :
这里 是目标图像, 是源图像, 是作用于 的映射方法函数.想象一下我们有一个图像 , 我们想满足下面的条件作重映射:,图像会按照 轴方向发生翻转.
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) );
- src: 源图像
- dst: 目标图像,与 src 相同大小
- map_x: x方向的映射参数. 它相当于方法 的第一个参数
- map_y: y方向的映射参数. 注意 map_y 和 map_x 与 src 的大小一致。
- CV_INTER_LINEAR: 非整数像素坐标插值标志. 这里给出的是默认值(双线性插值).
- BORDER_CONSTANT: 默认
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 来获得旋转矩阵。
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() );
posted on 2014-03-04 12:06 eric.xing 阅读(4795) 评论(0) 编辑 收藏 举报