OpenCV實現仿射變換

2021-06-27 15:44:16 字數 2776 閱讀 6144

乙個任意的仿射變換都能表示為 乘以乙個矩陣 (線性變換) 接著再 加上乙個向量 (平移).

綜上所述, 我們能夠用仿射變換來表示:

旋轉 (線性變換)

平移 (向量加)

縮放操作 (線性變換)

你現在可以知道, 事實上, 仿射變換代表的是兩幅圖之間的關係.

/// 全域性變數

char* source_window = "source image";

char* warp_window = "warp";

char* warp_rotate_window = "warp + rotate";

/** @function main */

int main( int argc, char** argv )

定義一些需要用到的變數, 比如需要用來儲存中間和目標影象的mat和兩個需要用來定義仿射變換的二維點陣列.

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;

載入源影象:

src = imread( argv[1], 1 );
以與源影象同樣的型別和大小來對目標影象初始化:

warp_dst = mat::zeros( src.rows, src.cols, src.type() );
仿射變換:正如上文所說, 我們需要源影象和目標影象上分別一一對映的三個點來定義仿射變換:

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 );

你可能想把這些點繪出來以獲得對變換的更直觀感受. 他們的位置大概就是在上面圖例中的點的位置 (原理部分). 你會注意到由三點定義的三角形的大小和方向改變了.

通過這兩組點, 我們能夠使用opencv函式 getaffinetransform 來求出仿射變換:

warp_mat = getaffinetransform( srctri, dsttri );
我們獲得了用以描述仿射變換的 2x3 矩陣 (在這裡是warp_mat)

將剛剛求得的仿射變換應用到源影象

warpaffine( src, warp_dst, warp_mat, warp_dst.size() );
函式有以下引數:

這樣我們就獲得了變換後的影象! 我們將會把它顯示出來. 在此之前, 我們還想要旋轉它...

旋**想要旋轉一幅影象, 你需要兩個引數:

旋轉影象所要圍繞的中心

旋轉的角度. 在opencv中正角度是逆時針的

可選擇: 縮放因子

我們通過下面的**來定義這些引數:

point center = point( warp_dst.cols/2, warp_dst.rows/2 );

double angle = -50.0;

double scale = 0.6;

我們利用opencv函式 getrotationmatrix2d 來獲得旋轉矩陣, 這個函式返回乙個 2x3  矩陣 (這裡是 rot_mat)

rot_mat = getrotationmatrix2d( center, angle, scale );
現在把旋轉應用到仿射變換的輸出.

warpaffine( warp_dst, warp_rotate_dst, rot_mat, warp_dst.size() );
最後我們把仿射變換和旋轉的結果繪製在窗體中,源影象也繪製出來以作參照:

namedwindow( source_window, cv_window_autosize );

imshow( source_window, src );

namedwindow( warp_window, cv_window_autosize );

imshow( warp_window, warp_dst );

namedwindow( warp_rotate_window, cv_window_autosize );

imshow( warp_rotate_window, warp_rotate_dst );

等待使用者退出程式

waitkey(0);

OpenCV 仿射變換

一 仿射變換 仿射變換是一種二維座標之間的變換,變換前後保持圖形的平直性和平行性。仿射變換可以理解為是向量經過一次線性變換和一次平移變換。void warpaffine inputarray src,outputarray dst,inputarray m,size dsize,int flags ...

opencv 仿射變換

仿射變換的兩種方式 1 利用變換前後的三個座標點達到變換目的。2 使用旋轉角度和縮放倍數來變換。在實際的使用中,採用1的方式比較方便,但是有乙個問題 變換之後的矩陣大小該如何正確設定,如果設定大小不合適,會導致圖的實際區域超出邊界。所以在此記錄一下解決辦法。思路 由於已知了變換前後的三個座標點,可以...

opencv 仿射變換的實現

先放 這版的 有點錯誤,裡面的指標分配了記憶體以後沒有釋放,有可能會造成記憶體洩漏 問題原因已經找到了,現在有點累,休息一下。大概說一下吧,主要是因為越界的問題 比如說反變換到輸入影象的時候,正確範圍應該是 0,in.rows 1 而不是 0,in.rows 果然,這一版的函式還是有bug,影象的平...