Python,OpenCV应用轮廓逼近算法,检测对象的形状
生活随笔
收集整理的這篇文章主要介紹了
Python,OpenCV应用轮廓逼近算法,检测对象的形状
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一篇博客,我們學習了如何利用Python、OpenCV計算輪廓的中心,這一節學習僅運用輪廓的基本屬性來檢測其形狀,三角形,正方形,矩形,五邊形,圓。
(1)利用輪廓逼近,將曲線上的點數減少為更簡單的近似版本的過程。
(2)基于該輪廓逼近,檢查每種形狀具有的頂點數量。有了頂點數,就能準確地標記每個形狀。三個點——三角形,四個點(結合寬高比確定矩形和正方形),5個點五邊形,其他的結合膨脹腐蝕假設其為圓;
# python detect_shapes.py --image shapes_and_colors.png# 導入必要的包
import argparse
import imutils
import cv2class ShapeDetector:def __init__(self):pass# 輪廓形狀識別器 只有一個參數 c:輪廓# 為了進行形狀檢測,我們將使用輪廓近似法。 顧名思義,輪廓近似(contour approximation)是一種算法,用于通過減少一組點來減少曲線中的點數,因此稱為術語近似。# 輪廓近似是基于以下假設:一條曲線可以由一系列短線段近似。這將導致生成近似曲線,該曲線由原始曲線定義的點子集組成。# 輪廓近似實際上已經通過cv2.approxPolyDP在OpenCV中實現。def detect(self, c):# 初始化形狀名稱,使用輪廓近似法shape = "unidentified"# 計算周長peri = cv2.arcLength(c, True)approx = cv2.approxPolyDP(c, 0.04 * peri, True)# 輪廓是由一系列頂點組成的;如果是三角形,將擁有3個向量if len(approx) == 3:shape = "triangle"# 如果有4個頂點,那么是矩形或者正方形elif len(approx) == 4:# 計算輪廓的邊界框 并且計算寬高比(x, y, w, h) = cv2.boundingRect(approx)ar = w / float(h)# 正方形的寬高比~~1 ,否則是矩形shape = "square" if ar >= 0.95 and ar <= 1.05 else "rectangle"# 如果是五邊形(pentagon),將有5個頂點elif len(approx) == 5:shape = "pentagon"# 否則,根據上邊的膨脹腐蝕,我們假設它為圓形else:shape = "circle"# 返回形狀的名稱return shape# 構建命令行參數
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,help="path to the input image")
args = vars(ap.parse_args())# 加載圖片 保持寬高比并resize到一個比較小的大小,以使其有更好的輪廓近似結果
image = cv2.imread(args["image"])
resized = imutils.resize(image, width=300)
ratio = image.shape[0] / float(resized.shape[0])# 轉換為灰度圖 高斯平滑減少高頻噪音 二值化圖像
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
thresh = cv2.threshold(blurred, 60, 255, cv2.THRESH_BINARY)[1]# 在閾值圖像上進行形狀檢測,并初始化形狀檢測器
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
# 兼容opencv版本獲取正確的輪廓結果
cnts = imutils.grab_contours(cnts)
sd = ShapeDetector()# 注意圖像是如何二值化的-形狀在黑色背景上顯示為白色前景。
# 循環遍歷每個輪廓,對每個輪廓執行形狀檢測,然后在對象上繪制形狀的名稱。
for c in cnts:# 計算輪廓的中心,應用輪廓檢測其形狀M = cv2.moments(c)cX = int((M["m10"] / M["m00"]) * ratio)cY = int((M["m01"] / M["m00"]) * ratio)shape = sd.detect(c)# 還原原始的輪廓大小# 將輪廓* 縮放的ratio比例 并將其繪制在圖像上,同時將形狀的標簽文本繪制在圖像上c = c.astype("float")c *= ratioc = c.astype("int")cv2.drawContours(image, [c], -1, (0, 255, 0), 2)cv2.putText(image, shape, (cX, cY), cv2.FONT_HERSHEY_SIMPLEX,0.5, (255, 255, 255), 2)# 展示輸出圖片cv2.imshow("Image", image)cv2.waitKey(0)
參考:
https://www.pyimagesearch.com/2016/02/08/opencv-shape-detection/
總結
以上是生活随笔為你收集整理的Python,OpenCV应用轮廓逼近算法,检测对象的形状的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王者荣耀里王昭君皮肤可以,怎么获得?
- 下一篇: 微信网名简单又好听四个字