理論
翻開任意一本影象處理的書,都會講到影象的幾何變換,這裡面包括:仿射變換(affine transformation)、投影變換(projecttive transformation)。前者針對的是平面上的物體位姿變化,如水平/垂直方向位移、旋轉、縮小/放大,常見的應用有orc字元識別。後者針對的是三維空間中的位置變化,受限於物體依然是平面的,也稱為二維投影變換,常見的應用有車牌識別。
影象變換:以上所有變換均可以通過矩陣描述,將輸入影象與變換矩陣進行矩陣乘法得到變換後的影象座標。顯然,這種方式非常適合程式設計實現。
opencv仿射變換函式說明
opencv提供了,從變換矩陣計算,到影象變換,每個流程的一攬子解決方案。
以opencv 3.0為例,參考幾何變換模組說明:
1、getaffinetransform
[cpp]view plain
copy
mat getaffinetransform(inputarray src, inputarray dst)
該函式需要已知變換前與變換後的座標,返回相應的變換矩陣,至於是何種變換無需事先知道。適用於目標檢測場合,通過檢測得到的特徵點進行影象匹配。
2、getrotationmatrix2d
[cpp]view plain
copy
mat getrotationmatrix2d(point2f center, double angle, double scale)
已知旋轉中心座標(座標原點為影象左上端點)、旋轉角度(單位為度°,順時針為負,逆時針為正)、放縮比例,返回旋轉/放縮矩陣。與getaffinetransform相比,無需知道變換後坐標,適用於一般情況下的影象變換。
3、warpaffine
[cpp]view plain
copy
void warpaffine(inputarray src, outputarray dst, inputarray m, size dsize, int flags=inter_linear, int bordermode=border_constant, const scalar& bordervalue=scalar())
根據etaffinetransform或getrotationmatrix2d得到的變換矩陣,計算變換後的影象。
src為輸入影象
dst為變換後影象,型別與src一致。
m為變換矩陣,需要通過其它函式獲得,當然也可以手動輸入。
dsize為輸出影象的大小
flags,插值演算法,詳細如下:
[cpp]view plain
copy
enum interpolationflags;
bordermode,邊界處理方式
[cpp]view plain
copy
enum bordertypes ;
opencv實現影象旋轉(其它仿射變換的流程與此一致)
[cpp]view plain
copy
mat src;
mat dst(src.size(),src.type());
...
cv::point2f center(x0,y0);
double ang = -30;
cv::mat rotmat = cv::getrotationmatrix2d(center,ang,1);
cv::warpaffine(src,dst,rotmat,src.size());
順時針旋轉30度
剛性仿射變換演算法 仿射變換
哎慢慢來吧,感覺一大堆東西看不懂.仿射變換就是affine transformation 這是乙個跟影象相關的變換,影象變換是通過矩陣變換來實現的。影象的幾個基本變換有平移 縮放 旋轉 仿射 透視。剛性變換 就像這個題目這樣顯示的,就是非常強硬的變換,在這個二維平面上開始是怎麼樣,後來就是怎麼樣 仿...
仿射變換transform
void viewdidload void clickmeaction 2 仿射變換比例 uiview animatewithduration 1animations 3 仿射變換旋轉 uiview animatewithduration 1animations 4 三種變換的結合 1 transl...
warpAffine OPENCV 仿射變換原理
在opencv中,目前並沒有現成的函式直接用來實現影象旋轉,它是用仿射變換函式cv warpaffine來實現的,此函式目前支援4種插值演算法,最近鄰 雙線性 雙三次 蘭索斯插值,如果傳進去的引數為基於畫素區域關係插值演算法 inter area 則按雙線性插值。通常使用2 3矩陣來表示仿射變換 其...