OpenCV中幾何形狀識別與測量
經常看到有學習OpenCV不久的人提問,如何識別一些簡單的幾何形狀與它們的顏色,其實通過OpenCV的輪廓發現與幾何分析相關的函數,只需不到100行的代碼就可以很好的實現這些簡單幾何形狀識別與對象測量相關操作。本文就會演示給大家如何通過OpenCV 輪廓發現與幾何分析相關函數實現如下功能:
幾何形狀識別(識別三角形、四邊形/矩形、多邊形、圓)
計算幾何形狀面積與周長、中心位置
提取幾何形狀的顏色
在具體代碼實現與程序演示之前,我們先要搞清楚一些概念。
一:基本概念與函數介紹
1. 輪廓(contours)
什么是輪廓,簡單說輪廓就是一些列點相連組成形狀、它們擁有同樣的顏色、輪廓發現在圖像的對象分析、對象檢測等方面是非常有用的工具,在OpenCV中使用輪廓發現相關函數時候要求輸入圖像是二值圖像,這樣便于輪廓提取、邊緣提取等操作。輪廓發現的函數與參數解釋如下:
findContours(image, mode, method, contours=None, hierarchy=None, offset=None)
- image輸入/輸出的二值圖像
- mode 返回輪廓的結構、可以是List、Tree、External
- method 輪廓點的編碼方式,基本是基于鏈式編碼
- contours 返回的輪廓集合
- hieracrchy 返回的輪廓層次關系
- offset 點是否有位移
2. 多邊形逼近
多邊形逼近,是通過對輪廓外形無限逼近,刪除非關鍵點、得到輪廓的關鍵點,不斷逼近輪廓真實形狀的方法,OpenCV中多邊形逼近的函數與參數解釋如下:
approxPolyDP(curve, epsilon, closed, approxCurve=None)
- curve 表示輸入的輪廓點集合
- epsilon 表示逼近曲率,越小表示相似逼近越厲害
- close 是否閉合
3. 幾何距計算
圖像幾何距是圖像的幾何特征,高階幾何距中心化之后具有特征不變性,可以產生Hu距輸出,用于形狀匹配等操作,這里我們通過計算一階幾何距得到指定輪廓的中心位置,計算幾何距的函數與參數解釋如下:
moments(array, binaryImage=None)
- array表示指定輸入輪廓
- binaryImage默認為None
二:代碼實現與演示
基于輪廓發現與多邊形逼近、幾何距實現幾何形狀識別與對象測量,測量時候還用到另外兩個相關API分別是計算輪廓的周長與面積。具體用法在代碼中體現。整個代碼實現分為如下幾步完成:1.圖像二值化
# 二值化圖像
print("start to detect lines... ")
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
cv.imshow("input image", frame)
2.輪廓發現
out_binary, contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
for cnt in range(len(contours)):
# 提取與繪制輪廓
cv.drawContours(result, contours, cnt, (0, 255, 0), 2)
3.幾何形狀識別
# 輪廓逼近
epsilon = 0.01 * cv.arcLength(contours[cnt], True)
approx = cv.approxPolyDP(contours[cnt], epsilon, True)
# 分析幾何形狀
corners = len(approx)
shape_type = ""
if corners == 3:
count = self.shapes['triangle']
count = count+1
self.shapes['triangle'] = count
shape_type = "三角形"
if corners == 4:
count = self.shapes['rectangle']
count = count + 1
self.shapes['rectangle'] = count
shape_type = "矩形"
if corners >= 10:
count = self.shapes['circles']
count = count + 1
self.shapes['circles'] = count
shape_type = "圓形"
if 4 < corners < 10:
count = self.shapes['polygons']
count = count + 1
self.shapes['polygons'] = count
shape_type = "多邊形"
4.測量周長、面積、計算中心
# 求解中心位置
mm = cv.moments(contours[cnt])
cx = int(mm['m10'] / mm['m00'])
cy = int(mm['m01'] / mm['m00'])
cv.circle(result, (cx, cy), 3, (0, 0, 255), -1)
# 計算面積與周長
p = cv.arcLength(contours[cnt], True)
area = cv.contourArea(contours[cnt])
5.顏色提取
# 顏色分析
color = frame[cy][cx]
color_str = "(" + str(color[0]) + ", " + str(color[1]) + ", " + str(color[2]) + ")"
運行顯示原圖如下:
分析結果:
控制臺輸出:
審核編輯 :李倩
-
幾何
+關注
關注
0文章
37瀏覽量
12386 -
測量
+關注
關注
10文章
4938瀏覽量
111822 -
OpenCV
+關注
關注
31文章
635瀏覽量
41562
原文標題:OpenCV中幾何形狀識別與測量
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
如何用OpenCV進行手勢識別--基于米爾全志T527開發板
![如何用<b class='flag-5'>OpenCV</b>進行手勢<b class='flag-5'>識別</b>--基于米爾全志T527開發板](https://file.elecfans.com/web2/M00/08/64/pYYBAGDwFEGADIPWAAFlJOlmLxg664.jpg)
【AI實戰項目】基于OpenCV的“顏色識別項目”完整操作過程
![【AI實戰項目】基于<b class='flag-5'>OpenCV</b>的“顏色<b class='flag-5'>識別</b>項目”完整操作過程](https://file1.elecfans.com/web3/M00/01/9C/wKgZPGdWrW6ALvshAAAgxUs2CfI310.png)
影響超聲波液位計測量結果的因素
OpenCV圖像識別C++代碼
opencv圖像識別有什么算法
opencv-python和opencv一樣嗎
基于OpenCV的人臉識別系統設計
cmm三坐標測量儀精準掌握形狀與位置公差
![cmm三坐標<b class='flag-5'>測量</b>儀精準掌握<b class='flag-5'>形狀</b>與位置公差](https://file1.elecfans.com/web2/M00/F2/D0/wKgZomZ6bQ2AMEWDAADiR1TKcbE650.png)
OpenCV攜奧比中光3D相機亮相CVPR 2024
機床的幾何精度什么和什么時是有區別的
ELF 1技術貼|如何在Ubuntu中編譯OpenCV庫
![ELF 1技術貼|如何在Ubuntu<b class='flag-5'>中</b>編譯<b class='flag-5'>OpenCV</b>庫](https://file1.elecfans.com/web2/M00/EB/90/wKgaomZZjUuAPcB7AAA6n2s3T5U762.png)
評論