cvBox2D和RotatedRect中返回的角度angle詳解


本文為作者原創,未經允許不得轉載;

原文由作者發表在博客園: 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是弧度的后來改為度了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM