OpenCV學習記錄3 仿射變換與重對映

2021-06-20 14:54:59 字數 1876 閱讀 3499

在影象處理中,發現很多書都會將幾何變換分為重對映·,仿射變換與透視變換。對於透視變換不是理解得和透徹,所以先總結一下重對映與放射變換。重對映就是

事實上,對映分為向前對映和向後對映,將輸入對映到輸出的是向前對映,反之就是向後對映,那remap是哪一種呢?下面是檢驗的**:

mat dst,map_x,map_y;

dst.create(src.size(),src.type());

map_x.create(src.size(),cv_32fc1);

map_y.create(src.size(),cv_32fc1);

for(int j=0;jsrc.cols*0.25 && i < src.cols*0.75 &&

j > src.rows*0.25 && j < src.rows*0.75 )

else}}

remap( src, dst, map_x, map_y, cv_inter_linear, border_constant, scalar(0,0,0));

namedwindow("rem");

imshow("rem",dst);

結果如下:

影象縮小了,根據map_x.at(j,i) = 2*( i - src.cols*0.25 ) + 0.5 ;map_y.at(j,i) = 2*( j - src.rows*0.25 ) + 0.5 ;說明是向後對映!

事實上,向前對映只適合於影象大小不改變的處理,不然會造成對映不完全或對映重疊,而向後對映則沒有這種限制,所以大多數的處理都是向後對映。

而放射變換則較好理解:乙個任意的仿射變換都能表示為

乘以乙個矩陣

(線性變換) 接著再 

加上乙個向量

(平移),通常用2*3的矩陣表示。

公式直接上圖:

說白了就是利用原圖的3點與目標圖的3點算出一條對應的變換公式,然後逐個位置變換,想必也應該是向後對映。程式如下:

結果就不貼了,基本上網上書上都有!注意上面的程式其實只是將做了映象,說明其實remap是可以和getaffinetransform、warpaffine組合互換的,個人覺得當然是直接仿射來得簡單點,但在時間和空間複雜度上,我都沒細算。

我的總結還不是和全面,因為沒老師指導的關係,也不不一定準確,寫出來是希望能和大家多交流,有錯誤或補充的地方希望一定要指出!謝謝。

OpenCV 仿射變換

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

opencv 仿射變換

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

OpenCV學習 仿射變換(affine)

影象的基本幾何變換有 平移,旋轉,尺度,仿射 仿射變換可以理解為平移旋轉尺度的組合效果。下面給出數學上的定義 a是2x2旋轉矩陣,b是平移向量 一 平移的實現 二 旋轉的實現 三 尺度的實現 從上面的實現可以看出,使用仿射變換是需要求解6個引數,旋轉矩陣4個,平移向量2個。這也是我們在使用openc...