1. 程式人生 > >Cvbox2D 角度 長寬正解

Cvbox2D 角度 長寬正解

關於cvBox2D和RotatedRect中返回的角度angle的opencv官方說明文件裡面沒有給出太多到資訊,其中文件是這樣說的:

 

                                                      圖1:opencv關於cvBox2D的說明文件截圖

在水平軸和第一條邊之間的角度。(好簡潔,但是真的並沒有太明確)

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是弧度的後來改為度了。

www.vsien.cn