在做漢字 驗證碼識別時用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