重映射
通過重映射來表達每個像素的位置 :
這里 是目標圖像,
是源圖像,
是作用於
的映射方法函數.想象一下我們有一個圖像
, 我們想滿足下面的條件作重映射:
,圖像會按照
軸方向發生翻轉.
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() );