本文將會(huì)用三個(gè)不同的示例說明用OpenCV如何進(jìn)行形狀的檢測(cè)與分析咐鹤。
從這三個(gè)示例中我們將會(huì)學(xué)到如何:
- 計(jì)算一個(gè)輪廓或圖形區(qū)域的中心點(diǎn)茎刚,這項(xiàng)小技能會(huì)在以后很多的OpenCV項(xiàng)目中將會(huì)非常實(shí)用胞谈。
- 識(shí)別不同的形狀股囊,例如圓形浓领,正方形反镇、矩形、三角形送火、橢圓等。
- 標(biāo)識(shí)形狀名稱
圖像中包含了太多對(duì)于我們這個(gè)示例中沒有意義信息先匪,我們的目標(biāo)是要從圖中檢測(cè)每個(gè)圖形的輪廓線并計(jì)算其中心點(diǎn)种吸,為了達(dá)到這個(gè)效果我們需要先對(duì)圖像進(jìn)行一些預(yù)處理:
- 灰度化
- 對(duì)圖像進(jìn)行模糊處理以減少輪廓邊緣出現(xiàn)的噪點(diǎn)
- 二值化圖像,通常地邊緣檢測(cè)與讀取閥值需要進(jìn)行此過程
$ pip install imutils
import argparse
import imutils
import cv2
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
help="path to the input image")
args = vars(ap.parse_args())
# 進(jìn)行灰度化得到二值圖
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
thresh = cv2.threshold(blurred, 60, 255, cv2.THRESH_BINARY)[1]
以下是上述代碼的輸出效果:
下一步就是調(diào)用OpenCV的findContour
方法檢測(cè)灰度化圖片中的輪廓:
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]
接下來就在每個(gè)輪廓上畫出一個(gè)突出的邊緣和標(biāo)出中心點(diǎn):
for c in cnts:
# 獲取中心點(diǎn)
M = cv2.moments(c)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
# 畫出輪廓和中點(diǎn)
cv2.drawContours(image, [c], -1, (0, 255, 0), 2)
cv2.circle(image, (cX, cY), 7, (255, 255, 255), -1)
cv2.putText(image, "center", (cX - 20, cY - 20),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
#顯示圖像
cv2.imshow("Image", image)
cv2.waitKey(0)
上述代碼中cv2.moments()
是用于計(jì)算圖像矩呀非,然后通過圖像矩計(jì)算質(zhì)心坚俗。以下是代碼的顯示效果: