Python?OpenCV中cv2.minAreaRect實(shí)例解析
在這個(gè)文章中,我們將學(xué)習(xí)如何在感興趣區(qū)域周圍畫(huà)最小面積矩形框。
1.最小面積矩形框
下圖顯示了兩個(gè)矩形框,綠色的是普通矩形框,紅色的是最小面積矩形框??梢园l(fā)現(xiàn),紅色的是旋轉(zhuǎn)矩形。

OpenCV提供了一個(gè)函數(shù)cv2.minAreaRect來(lái)尋找最小面積的旋轉(zhuǎn)矩形。將2D點(diǎn)集作為輸入,并返回一個(gè)Box2D結(jié)構(gòu),其中包括以下詳細(xì)信息–(中心(x,y),(寬度、高度)、旋轉(zhuǎn)角度)。
(center(x,y), (width, height), angle of rotation) = cv2.minAreaRect(points)
但是要繪制一個(gè)矩形,我們需要矩形的四個(gè)角,因此為了將Box2D結(jié)構(gòu)轉(zhuǎn)換為4個(gè)角點(diǎn),OpenCV提供了另一個(gè)函數(shù)cv2.boxPoints(),這將Box2D結(jié)構(gòu)作為輸入并返回4個(gè)角點(diǎn)。4個(gè)角點(diǎn)從y最高的點(diǎn)開(kāi)始按順時(shí)針順序排列。語(yǔ)法如下:
points = cv2.boxPoints(box)
在繪制矩形之前,需要將4個(gè)角點(diǎn)轉(zhuǎn)換為整數(shù)類型??梢允褂胣p.int32或者np.int64(不要使用np.int8,因?yàn)樗试S最大值127并截?cái)啵?。有時(shí),你可能會(huì)看到使用了np.int0,不要混淆,這相當(dāng)于np.int32或者np.int64,具體取決于你的系統(tǒng)結(jié)構(gòu)。完整的代碼如下:
rect = CV2.minAreaRect(cnt) box = cv2.boxPoints(rect) box = np.int0(box)
得到四個(gè)坐標(biāo)后,就可以輕松繪制圖形了。現(xiàn)在,讓我們討論一下旋轉(zhuǎn)角度。
2.旋轉(zhuǎn)角度
獲得四個(gè)角點(diǎn)以后,這四個(gè)角點(diǎn)從具有最高y的點(diǎn)開(kāi)始按順時(shí)針順序排列,如下所示。如果2個(gè)點(diǎn)具有相同的最高y,則最右的點(diǎn)是起點(diǎn)。這些點(diǎn)被編號(hào)為0,1,2,3(0開(kāi)始,3結(jié)束)。

因此,OpenCV的cv2.minAreaRect()給出的旋轉(zhuǎn)角度實(shí)際上是直線(連接起點(diǎn)和終點(diǎn))與水平線之間的角度,如下所示。

因此角度值始終位于[-90, 0)之間。為什么?因?yàn)槿绻麑?duì)象旋轉(zhuǎn)超過(guò)90°,則使用下一條邊來(lái)計(jì)算與水平面的角度。因此計(jì)算出的角度始終位于[-90,0)之間。

實(shí)際角度是對(duì)象旋轉(zhuǎn)的角度,計(jì)算出的角度是cv.minAreaRect()返回的角度。
補(bǔ)充:cv2.minAreaRect輸出旋轉(zhuǎn)角度測(cè)試
函數(shù)使用方法
min_rect = cv2.minAreaRect(cnt) # 輸入?yún)?shù)cnt是通過(guò)findContours識(shí)別出來(lái)的輪廓信息 # 輸出min_rect是一個(gè)元組,其中的結(jié)構(gòu)是最小外接矩形的(中心(x,y),(邊1長(zhǎng)度,邊2長(zhǎng)度),旋轉(zhuǎn)角度)
簡(jiǎn)單測(cè)試一下對(duì)幾個(gè)角度的矩形和平行四邊形的識(shí)別效果
圖片可能較小,建議放大觀看

可以看到,輸出的旋轉(zhuǎn)角度和矩形邊2的選擇有關(guān),具體函數(shù)是按照什么規(guī)則來(lái)確定邊1和邊2,我還不清楚,但是根據(jù)上面的實(shí)驗(yàn)結(jié)論,大致可以推測(cè)出以下規(guī)律:
- 規(guī)定水平矩陣為上圖第一個(gè)矩形形狀,即長(zhǎng)邊平行于x軸,短邊垂直于x軸,
- 按住水平矩形的左上角,逆時(shí)針旋轉(zhuǎn)矩形不超過(guò)90度 形成的矩形,長(zhǎng)邊作為邊2;
- 按住水平矩形的左上角,順時(shí)針旋轉(zhuǎn)矩形小于90度 形成的矩形,短邊作為邊2。
參考目錄
https://theailearner.com/tag/cv2-minarearect/
總結(jié)
到此這篇關(guān)于Python OpenCV中cv2.minAreaRect的文章就介紹到這了,更多相關(guān)OpenCV cv2.minAreaRect解析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python使用tkinter實(shí)現(xiàn)自定義多參數(shù)對(duì)話框
Tkinter模塊是Python標(biāo)準(zhǔn)庫(kù)中的一部分,用于創(chuàng)建圖形用戶界面(GUI)應(yīng)用程序,它提供了一組工具和組件,用于創(chuàng)建窗口、按鈕、文本框等用戶界面元素,并且可以響應(yīng)用戶的輸入,本文將給大家講講python如何使用tkinter實(shí)現(xiàn)自定義多參數(shù)對(duì)話框2023-08-08
python自動(dòng)分箱,計(jì)算woe,iv的實(shí)例代碼
今天小編就為大家分享一篇python自動(dòng)分箱,計(jì)算woe,iv的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
地圖可視化神器kepler.gl python接口的使用方法
這篇文章主要介紹了python 地圖可視化神器kepler.gl近期重要更新的的相關(guān)資料,幫助大家利用python實(shí)現(xiàn)地圖可視化,感興趣的朋友可以了解下2020-12-12
基于python爬取梨視頻實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了基于python爬取梨視頻實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Python字符串字母大小寫(xiě)轉(zhuǎn)換的各種情況詳析
在使用python語(yǔ)言開(kāi)發(fā)中經(jīng)常會(huì)碰到,需要大寫(xiě)轉(zhuǎn)小寫(xiě),小寫(xiě)轉(zhuǎn)換大寫(xiě),甚至字符串中的單詞首字母大寫(xiě),以及字符串手字字母大寫(xiě)的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Python字符串字母大小寫(xiě)轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下2022-05-05
Python 判斷 有向圖 是否有環(huán)的實(shí)例講解
下面小編就為大家分享一篇Python 判斷 有向圖 是否有環(huán)的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02

