答案 0 :(得分:3)
这是一种潜在的方法:
我们将图像转换为HSV,然后使用cv2.inRange()
确定上下边界以创建蒙版。此步骤将黄色物体隔离出来
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = np.array([0, 208, 94], dtype="uint8")
upper = np.array([179, 255, 232], dtype="uint8")
mask = cv2.inRange(image, lower, upper)
接下来要确定形状,我们找到轮廓并使用顶点数进行过滤。我们使用cv2.arcLength()
和cv2.approxPolyDP()
获得顶点和近似轮廓的列表。我们可以检查此列表中的条目数,以确定对象的形状。例如,如果轮廓具有三个顶点,则它必须是三角形。同样,如果它具有四个个顶点,则它必须是一个正方形。因此,对于该图像,我们可以假设形状具有大于一定数量的顶点的形状为圆形。这是结果
import numpy as np
import cv2
image = cv2.imread('1.png')
original = image.copy()
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = np.array([0, 208, 94], dtype="uint8")
upper = np.array([179, 255, 232], dtype="uint8")
mask = cv2.inRange(image, lower, upper)
# Find contours
cnts = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Extract contours depending on OpenCV version
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
# Iterate through contours and filter by the number of vertices
for c in cnts:
perimeter = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.04 * perimeter, True)
if len(approx) > 5:
cv2.drawContours(original, [c], -1, (36, 255, 12), -1)
cv2.imshow('mask', mask)
cv2.imshow('original', original)
cv2.imwrite('mask.png', mask)
cv2.imwrite('original.png', original)
cv2.waitKey()