Python?OpenCV中cv2.minAreaRect實例解析
在這個文章中,我們將學習如何在感興趣區(qū)域周圍畫最小面積矩形框。
1.最小面積矩形框
下圖顯示了兩個矩形框,綠色的是普通矩形框,紅色的是最小面積矩形框??梢园l(fā)現(xiàn),紅色的是旋轉矩形。
OpenCV提供了一個函數(shù)cv2.minAreaRect來尋找最小面積的旋轉矩形。將2D點集作為輸入,并返回一個Box2D結構,其中包括以下詳細信息–(中心(x,y),(寬度、高度)、旋轉角度)。
(center(x,y), (width, height), angle of rotation) = cv2.minAreaRect(points)
但是要繪制一個矩形,我們需要矩形的四個角,因此為了將Box2D結構轉換為4個角點,OpenCV提供了另一個函數(shù)cv2.boxPoints(),這將Box2D結構作為輸入并返回4個角點。4個角點從y最高的點開始按順時針順序排列。語法如下:
points = cv2.boxPoints(box)
在繪制矩形之前,需要將4個角點轉換為整數(shù)類型。可以使用np.int32或者np.int64(不要使用np.int8,因為它允許最大值127并截斷)。有時,你可能會看到使用了np.int0,不要混淆,這相當于np.int32或者np.int64,具體取決于你的系統(tǒng)結構。完整的代碼如下:
rect = CV2.minAreaRect(cnt) box = cv2.boxPoints(rect) box = np.int0(box)
得到四個坐標后,就可以輕松繪制圖形了?,F(xiàn)在,讓我們討論一下旋轉角度。
2.旋轉角度
獲得四個角點以后,這四個角點從具有最高y的點開始按順時針順序排列,如下所示。如果2個點具有相同的最高y,則最右的點是起點。這些點被編號為0,1,2,3(0開始,3結束)。
因此,OpenCV的cv2.minAreaRect()給出的旋轉角度實際上是直線(連接起點和終點)與水平線之間的角度,如下所示。
因此角度值始終位于[-90, 0)之間。為什么?因為如果對象旋轉超過90°,則使用下一條邊來計算與水平面的角度。因此計算出的角度始終位于[-90,0)之間。
實際角度是對象旋轉的角度,計算出的角度是cv.minAreaRect()返回的角度。
補充:cv2.minAreaRect輸出旋轉角度測試
函數(shù)使用方法
min_rect = cv2.minAreaRect(cnt) # 輸入?yún)?shù)cnt是通過findContours識別出來的輪廓信息 # 輸出min_rect是一個元組,其中的結構是最小外接矩形的(中心(x,y),(邊1長度,邊2長度),旋轉角度)
簡單測試一下對幾個角度的矩形和平行四邊形的識別效果
圖片可能較小,建議放大觀看
可以看到,輸出的旋轉角度和矩形邊2的選擇有關,具體函數(shù)是按照什么規(guī)則來確定邊1和邊2,我還不清楚,但是根據(jù)上面的實驗結論,大致可以推測出以下規(guī)律:
- 規(guī)定水平矩陣為上圖第一個矩形形狀,即長邊平行于x軸,短邊垂直于x軸,
- 按住水平矩形的左上角,逆時針旋轉矩形不超過90度 形成的矩形,長邊作為邊2;
- 按住水平矩形的左上角,順時針旋轉矩形小于90度 形成的矩形,短邊作為邊2。
參考目錄
https://theailearner.com/tag/cv2-minarearect/
總結
到此這篇關于Python OpenCV中cv2.minAreaRect的文章就介紹到這了,更多相關OpenCV cv2.minAreaRect解析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Pytorch轉keras的有效方法,以FlowNet為例講解
這篇文章主要介紹了Pytorch轉keras的有效方法,以FlowNet為例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05Python英文文本分詞(無空格)模塊wordninja的使用實例
今天小編就為大家分享一篇關于Python英文文本分詞(無空格)模塊wordninja的使用實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02python?pandas數(shù)據(jù)處理教程之合并與拼接
在實際處理數(shù)據(jù)業(yè)務需求中,我們經(jīng)常會遇到這樣的需求,將多個表連接起來再進行數(shù)據(jù)的處理和分析,類似SQL中的連接查詢功能,下面這篇文章主要給大家介紹了關于python?pandas數(shù)據(jù)處理教程之合并與拼接的相關資料,需要的朋友可以參考下2022-02-02Python循環(huán)語句之while循環(huán)和for循環(huán)詳解
在Python中,循環(huán)語句用于重復執(zhí)行一段代碼,直到滿足某個條件為止,在Python中,有兩種主要的循環(huán)語句:for循環(huán)和while循環(huán),本文就來給大家介紹一下這兩個循環(huán)的用法,需要的朋友可以參考下2023-08-08