關於cv::warpaffine函數

來源:互聯網
上載者:User

  在做漢字 驗證碼識別時用warpAffine做了個映像旋轉,發現有點問題。仔細看了下這個函數的說明,如下:

//! warps the image using affine transformation
CV_EXPORTS_W void warpAffine( const Mat& src, CV_OUT Mat& dst,
                            const Mat& M, Size dsize,
                            int flags=INTER_LINEAR,
                            int borderMode=BORDER_CONSTANT,
                            const Scalar& borderValue=Scalar());

 

對應的解釋網址http://opencv.willowgarage.com/documentation/cpp/geometric_image_transformations.html

 

映像的變換通過下面的公式完成

M 矩陣可以通過cv::Mat mat = cv::getRotationMatrix2D(center, angle, 1.0); 產生

其中center確定了旋轉的中心點,angle是旋轉的角度,1.0是放大的倍數。

 

M矩陣也可以指定為其他的形式,如自己設定M的值,

以center(23,23),angle=59.9,factor=1.0旋轉映像對應的M值為

       注意M是CV_64F的。這個類型用at<t>似乎無法訪問,它認為M是unsigned類型的。

需要強制類型轉換double* m = (double*)M.data;,然後通過指標進行讀取。具體代碼可以參考getRotationMatrix2D的源碼。

 

這個值通過下面的公式計算得到

 

在做字元旋轉的時候,-59度的角度傾斜矯正有錯誤,而

-32度的角度是正確的。

 

原因出在cv::minAreaRect上,計算左轉的傾斜角度時有90的相差,後面這個圖是右轉的,前面是左轉的。

如何知道該不該+這個90度呢?源碼很長,沒仔細看。大致是用最左下角的點為conner,確定兩個邊來計算的,問題是取那個邊呢?用位置關係好像無論怎麼取,左轉和右轉的時候,這個邊都有個切換。(懶的畫圖了。大家可以自己畫個圖看看)2個邊向量剛好有90度的差。一種方法是確定取長邊,但有些字不適合。

 

另外warpAffine有個參數需要注意:WARP_INVERSE_MAP

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.