總結記錄 (opencv取任意位置矩形矯正演算法)

2021-07-08 22:34:58 字數 1401 閱讀 4631

大致思路如下:

1、建立乙個與源影象src 的 size 相同的單通道矩陣 mask ,並 cvzero( mask );

2、用 cvpolyline() 將已知的4個角點連成乙個四邊形,畫在 mask 上;

3、用 cvfillconvexpoly 或 cvfillpoly 將 mask 上的四邊形塗色;

4、用 cvcopy(src, dst, mask) 將四邊形區域複製到 dst。

在 cvcopy 之後可以用 cvresize 將影象轉換至較小的一幅影象上,具體地:

1-4 ……;

5、求出能包含已知角點的、水平/垂直的最小矩形 minrect (可以用 cvboundingrect 、也可以自行程式設計獲取 minrect);

6、建立一幅與 minrect 相同大小的影象 scaled_dst ;

7、將 cvcopy 所得的 dst 影象的 roi 設定為 minrect 的位置:cvsetimageroi(dst, minrect) ;

8、獲得所需的小影象:cvresize(dst, scaled_dst)

這個過程是複製出了這個矩形,但這個矩形在新的scaled_dst仍為斜的,或者可以說他複製出了包圍這個斜矩形的最小矩形,但這個斜矩形還是沒能正過來。如果要得到包圍這個斜矩形的最小矩形在原影象上用cvsetimageroi()就好了。

cvsetimageroi(),可以設定成斜的矩形嗎?好像它的引數必須為乙個正矩形。

我是想把這個斜矩形拷出來。其他沒有別的東西。

那可以用 opencv 的仿射變換函式來實現,具體地:

1、建立乙個與傾斜矩形相同大小的影象 dst ;

2、將傾斜矩形的角點座標 srt_pns 換算為 垂直矩形的角點座標 dst_pns ,利用 cvgetaffinetransform 獲取旋轉矩陣 map_matrix;

3、利用 cvwarpaffine 函式將原影象 srt 旋轉,使感興趣的矩形區域由傾斜旋轉至垂直(或水平);

4、利用 cvsetimageroi 和 cvresize 將感興趣區域複製到 dst 。

是的,這個方法應該是可行的,我原來那個旋轉有點麻煩,我目前利用的是cvgetquadranglesubpix()實現旋轉,但它有個缺點就是必須是旋轉中心在原影象中心(不然旋轉前後座標不知道如何對應),這樣我的做法其實是:

1.計算斜矩形在原影象中的左上角點座標。

2.使用cvgetrectsubpix()以左上角點座標為中心,複製出乙個包括原斜矩形的子影象dst1。

3.使用cvgetquadranglesubpix()實現對上部的子圖dst1旋轉並複製出乙個新子圖dst2(與子影象大小一致),角度可以通過原左上角點和原右上角點座標計算得出。

4.使用cvgetrectsubpix()複製出斜矩形旋轉後的子圖,此時原斜矩形左上角點在dst2的中心,且已經轉到水平。

學習opencv記錄 三)

include include highgui.h include cv.h 這種訪問操作比cvget系列函式更快,因為不需要入棧出棧,只是通過指標偏移來進行的 int main int argc,char argv cvmat mat cvinitmatheader mat,3,6,cv 32fc...

Opencv常用函式記錄

pip install opencv python 使用import cv2 獲得影象的形狀,返回值是乙個包含行數,列數,通道數的元組 print image.shape print image.size 影象的資料型別 print image.dtype 各引數依次是 新增的文字 左上角座標 字型...

OpenCV學習記錄5

一 學習內容 1 兩張影象按權重相加 2 兩張影象相乘 應該可用於頻域濾波吧 二 include include using namespace std using namespace cv int main int argc,char ar if src2.data namedwindow fig...