網(wǎng)站首頁 編程語言 正文
在這個(gè)文章中,我們將學(xué)習(xí)如何在感興趣區(qū)域周圍畫最小面積矩形框。
1.最小面積矩形框
下圖顯示了兩個(gè)矩形框,綠色的是普通矩形框,紅色的是最小面積矩形框??梢园l(fā)現(xiàn),紅色的是旋轉(zhuǎn)矩形。
OpenCV提供了一個(gè)函數(shù)cv2.minAreaRect來尋找最小面積的旋轉(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)開始按順時(shí)針順序排列。語法如下:
points = cv2.boxPoints(box)
在繪制矩形之前,需要將4個(gè)角點(diǎn)轉(zhuǎn)換為整數(shù)類型。可以使用np.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)后,就可以輕松繪制圖形了?,F(xiàn)在,讓我們討論一下旋轉(zhuǎn)角度。
2.旋轉(zhuǎn)角度
獲得四個(gè)角點(diǎn)以后,這四個(gè)角點(diǎn)從具有最高y的點(diǎn)開始按順時(shí)針順序排列,如下所示。如果2個(gè)點(diǎn)具有相同的最高y,則最右的點(diǎn)是起點(diǎn)。這些點(diǎn)被編號為0,1,2,3(0開始,3結(jié)束)。
因此,OpenCV的cv2.minAreaRect()給出的旋轉(zhuǎn)角度實(shí)際上是直線(連接起點(diǎn)和終點(diǎn))與水平線之間的角度,如下所示。
因此角度值始終位于[-90, 0)之間。為什么?因?yàn)槿绻麑ο笮D(zhuǎn)超過90°,則使用下一條邊來計(jì)算與水平面的角度。因此計(jì)算出的角度始終位于[-90,0)之間。
實(shí)際角度是對象旋轉(zhuǎn)的角度,計(jì)算出的角度是cv.minAreaRect()返回的角度。
補(bǔ)充:cv2.minAreaRect輸出旋轉(zhuǎn)角度測試
函數(shù)使用方法
min_rect = cv2.minAreaRect(cnt)
# 輸入?yún)?shù)cnt是通過findContours識別出來的輪廓信息
# 輸出min_rect是一個(gè)元組,其中的結(jié)構(gòu)是最小外接矩形的(中心(x,y),(邊1長度,邊2長度),旋轉(zhuǎn)角度)
簡單測試一下對幾個(gè)角度的矩形和平行四邊形的識別效果
圖片可能較小,建議放大觀看
可以看到,輸出的旋轉(zhuǎn)角度和矩形邊2的選擇有關(guān),具體函數(shù)是按照什么規(guī)則來確定邊1和邊2,我還不清楚,但是根據(jù)上面的實(shí)驗(yàn)結(jié)論,大致可以推測出以下規(guī)律:
- 規(guī)定水平矩陣為上圖第一個(gè)矩形形狀,即長邊平行于x軸,短邊垂直于x軸,
- 按住水平矩形的左上角,逆時(shí)針旋轉(zhuǎn)矩形不超過90度 形成的矩形,長邊作為邊2;
- 按住水平矩形的左上角,順時(shí)針旋轉(zhuǎn)矩形小于90度 形成的矩形,短邊作為邊2。
參考目錄
https://theailearner.com/tag/cv2-minarearect/
總結(jié)
原文鏈接:https://blog.csdn.net/weixin_43229348/article/details/125986969
相關(guān)推薦
- 2022-12-12 flutter?InheritedWidget使用方法總結(jié)_Android
- 2022-08-19 注解配置SpringMVC
- 2022-09-04 C語言中反斜杠的作用及說明_C 語言
- 2022-10-09 ASP.NET泛型四之使用Lazy<T>實(shí)現(xiàn)延遲加載_實(shí)用技巧
- 2022-09-06 Python中閉包與lambda的作用域解析_python
- 2022-08-16 python切片操作方法的實(shí)例總結(jié)_python
- 2022-06-22 Android?ViewPager實(shí)現(xiàn)頁面左右切換效果_Android
- 2022-08-23 一文搞懂Python中函數(shù)的定義與使用_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支