Python 使用opencv检测具有特定颜色的圆

Python 使用opencv检测具有特定颜色的圆,python,image,opencv,image-processing,color-detection,Python,Image,Opencv,Image Processing,Color Detection,我必须使用OpenCV和python检测图像中的黄色圆圈,如第一幅图像所示: 一旦我检测到黄色圆圈,我必须高亮显示它,如下所示: 我是OpenCV新手,所以我一直在寻求一些指导或帮助。感谢所有帮助这里有一个潜在的方法: 将图像转换为HSV 查找上/下颜色边界并创建遮罩 查找轮廓并使用顶点数进行过滤 我们将图像转换为HSV,然后使用cv2.inRange()确定上下边界以创建遮罩。此步骤将隔离黄色对象 image = cv2.cvtColor(image, cv2.COLOR_BGR2HS

我必须使用OpenCV和python检测图像中的黄色圆圈,如第一幅图像所示:

一旦我检测到黄色圆圈,我必须高亮显示它,如下所示:


我是OpenCV新手,所以我一直在寻求一些指导或帮助。感谢所有帮助

这里有一个潜在的方法:

  • 将图像转换为HSV
  • 查找上/下颜色边界并创建遮罩
  • 查找轮廓并使用顶点数进行过滤
我们将图像转换为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()


cv2.inRange
cv2.HoughCircles
?这非常有效,但我想知道您是否可以解释CNT=cv2.findContours(mask,cv2.RETR\u EXTERNAL,cv2.CHAIN\u About\u SIMPLE)的情况。CNT=CNT[0]如果len(CNT)==2,其他CNT[1]请看一看。本质上来说,cv2.RETR_EXTERNAL是一个标志,简而言之,它告诉OpenCV只获取外部轮廓,而不获取内部轮廓。第二条线捕捉所有轮廓。根据OpenCV版本的不同,findContours将返回2或3个参数。因此,该线根据返回的参数数量手动获取轮廓