OpenCV 仿射變換

2021-09-11 16:09:06 字數 3725 閱讀 6416

一 仿射變換

仿射變換是一種二維座標之間的變換,變換前後保持圖形的平直性和平行性。仿射變換可以理解為是向量經過一次線性變換和一次平移變換。

void warpaffine(inputarray src, outputarray dst, inputarray m, size dsize, int flags=inter_linear, int bordermode=border_constant, const scalar& bordervalue=scalar())
引數inputarray src:輸入變換前影象

引數outputarray dst:輸出變換後影象,需要初始化乙個空矩陣用來儲存結果,不用設定矩陣尺寸

引數inputarray m:變換矩陣,用另乙個函式getaffinetransform()計算

引數size dsize:設定輸出影象大小

引數int flags=inter_linear:設定插值方式,預設方式為線性插值

mat getaffinetransform(const point2f* src, const point2f* dst)
引數const point2f* src:原圖的三個固定頂點

引數const point2f* dst:目標影象的三個固定頂點

返回值:mat型變換矩陣,可直接用於warpaffine()函式

注意,頂點陣列長度超過3個,則會自動以前3個為變換頂點;陣列可用point2f或point2f*表示

1 畫出立方體

大小為600*600,立方體邊長為300。

首先畫出前面,各點座標為(50,200),(350,200),(350,500),(50,500)。

然後畫出上邊平行四邊形,座標為(250,100),(550,100)。

最後畫出右邊平行四邊形,座標(550,400)。

2 匯入

大小為300*300

3 正面嵌入

4 上平行四邊形仿射變換

5 右平行四邊形仿射變換

//仿射變換源程式

#include#include#includeusing namespace cv;

using namespace std;

int main(int argc, char* ar**) ;

point2f dst2_points[3] = ;

mat m2 = getaffinetransform(src2_points, dst2_points);

mat dst_2;

size size2(500, 100);

warpaffine(img_2, dst_2, m2, size2);

mat roi_2 = src_img(rect(50, 100, dst_2.cols, dst_2.rows));

mat mask_2(roi_2.rows, roi_2.cols, roi_2.depth(), scalar(0));

dst_2.copyto(roi_2, dst_2);

//右影象嵌入

point2f src3_points[3] = ;

point2f dst3_points[3] = ;

mat m3 = getaffinetransform(src3_points, dst3_points);

mat dst_3;

size size3(200, 400);

warpaffine(img_3, dst_3, m3, size3);

mat roi_3 = src_img(rect(350, 100, dst_3.cols, dst_3.rows));

mat mask_3(roi_3.rows, roi_3.cols, roi_3.depth(), scalar(0));

dst_3.copyto(roi_3, dst_3);

//正方形

line(src_img, point(50, 500), point(350, 500), scalar(255, 0, 255), 1, cv_aa);

line(src_img, point(50, 200), point(350, 200), scalar(255, 0, 255), 1, cv_aa);

line(src_img, point(50, 200), point(50, 500), scalar(255, 0, 255), 1, cv_aa);

line(src_img, point(350, 200), point(350, 500), scalar(255, 0, 255), 1, cv_aa);

//上平行四邊形

line(src_img, point(250, 100), point(50, 200), scalar(255, 0, 255), 1, cv_aa);

line(src_img, point(250, 100), point(550, 100), scalar(255, 0, 255), 1, cv_aa);

line(src_img, point(550, 100), point(350, 200), scalar(255, 0, 255), 1, cv_aa);

//右平行四邊形

line(src_img, point(550, 100), point(550, 400), scalar(255, 0, 255), 1, cv_aa);

line(src_img, point(550, 400), point(350, 500), scalar(255, 0, 255), 1, cv_aa);

imshow("img_1", img_1);

imshow("img_2", img_2);

imshow("img_3", img_3);

imshow("dst_2", dst_2);

imshow("dst_3", dst_3);

imshow("180121", src_img);

waitkey(0);

return 0;

}

opencv 仿射變換

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

OpenCV實現仿射變換

乙個任意的仿射變換都能表示為 乘以乙個矩陣 線性變換 接著再 加上乙個向量 平移 綜上所述,我們能夠用仿射變換來表示 旋轉 線性變換 平移 向量加 縮放操作 線性變換 你現在可以知道,事實上,仿射變換代表的是兩幅圖之間的關係.全域性變數 char source window source image...

OpenCV與仿射變換

拉伸 收縮 扭曲 旋轉是影象的幾何變換,在三維視覺技術中大量應用到這些變換,又分為仿射變換和透視變換。由圖可以看出,仿射變換是透視變換的子集。仿射變換包括平移,旋轉,縮放。由三對點計算仿射變換 src 輸入影象的三角形頂點座標。dst 輸出影象的相應的三角形頂點座標。返回乙個2x3的變換矩陣。2.w...