OpenCV學習筆記(九) 重映射、仿射變換


重映射

通過重映射來表達每個像素的位置 (x,y) :

g(x,y) = f ( h(x,y) )

這里 g() 是目標圖像, f() 是源圖像, h(x,y) 是作用於 (x,y) 的映射方法函數.想象一下我們有一個圖像 I , 我們想滿足下面的條件作重映射:h(x,y) = (I.cols - x, y )圖像會按照 x 軸方向發生翻轉.

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方向的映射參數. 它相當於方法 h(i,j) 的第一個參數
  • 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() );

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM