本文為作者原創,未經允許不得轉載;
原文由作者發表在博客園: http://www.cnblogs.com/panxiaochun/p/5478555.html關於cvBox2D和RotatedRect中返回的角度angle的opencv官方說明文檔里面沒有給出太多到信息,其中文檔是這樣說的:
圖1:opencv關於cvBox2D的說明文檔截圖
在水平軸和第一條邊之間的角度。(好簡潔,但是真的並沒有太明確)
在網上也有關於cvBox2D和RotatedRect的角度angle的說明,但是查看了一下,不對,或者不完全對。其中有兩篇:http://blog.csdn.net/mine1024/article/details/6044856和
http://blog.csdn.net/a553654745/article/details/45743063,其中說到了,x軸逆時針碰到的第一條邊為width(實際中width可能比Height還大,實際使用中確實發現了width比height還大的情況),下面選取兩篇文章中的圖來說明一下:
圖2:網友關於旋轉角的說明圖
這幅圖是網上流傳最多的,但是只有一篇原創,其它都是復制粘貼,有的甚至只是放了一幅圖,這篇博文只告訴我們一個有用的東西,x軸逆時針碰到的第一條邊為width,並與這條邊形成的角度就是cvBox2D和RotatedRect的角度angle,但是這篇博文忽略了,一個事實就是opencv的坐標原點是左上角,所以這個坐標系是錯的。下面的圖就比較完整的說明了cvBox2D和RotatedRect的角度的來源:
圖3:網友關於opencv旋轉角的修正圖
這個圖是很好說明角度的選取的來源,但是我本人覺得有點錯誤所以,修正了一下:
圖4:我個人關於cvBox2D和RotatedRect里面的角度angle的說明圖
這是本人修改過的圖,下面進入論證,這里用了一幅圖,里面有兩個旋轉的矩形,其中由於旋轉的角度不一樣,所以opencv找出來的cvBox2D里面的width有可能會比height大
圖5:測試圖片里面的兩個矩形圖
其中第一個由於它是逆時針旋轉的,所以,x軸會先碰到頂部的直線L1,第二個矩形是順時針旋轉的,所以x軸會先碰到左邊的直線L2,很明顯L2會比L1大,其中L1也會比它左邊的直線小:
圖6:第一個矩形的檢測結果圖
第一個矩形的角度只有-22度(再次證明不是書上說的弧度)其中width為130,比height小。
圖7:第二個矩形的檢測結果圖
第二個矩形的角度為-77度,width為234,比height109大,其中還比第一個矩形的width大。論證成立。
其中角度的正負,在網上很多都說逆時針為正,順時為負,這里逆時針為負,順時針為正,主要原因,我個人覺得是和坐標系有關,因為網上說的角度的旋轉的坐標系是以圖2的坐標系作為參考,而opencv里面是以圖3的作為參考,所以在x軸和y軸的象限里的角度為正的原則吧,opencv里逆時針為負。
圖8:論證結果詳解圖
在opencv的源碼的\modules\ imgproc\src下的rot calipers.cpp里可以找到minareaRect()函數的源碼,該函數會返回RotatedRect,在c#版會返回CvBox2D,兩個是一樣的,在里面找到了angle不是弧度最佳證明:
box.angle = (float)(box.angle*180/CV_PI);
可以看出返回的RotatedRect的angle不是弧度單位,剛開始angle是弧度的,后來經過轉換后再輸出了,可能前幾個版本里面的angle是弧度的后來改為度了。