【问题标题】:Detect circles with specific colors using opencv使用opencv检测具有特定颜色的圆圈
【发布时间】:2019-07-03 18:14:43
【问题描述】:

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

一旦检测到黄色圆圈,我必须将其突出显示,如下所示:

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

【问题讨论】:

  • cv2.inRangecv2.HoughCircles?

标签: python image opencv image-processing color-detection


【解决方案1】:

这是一种可能的方法:

  • 将图像转换为 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()

【讨论】:

  • 这很好用,但我想知道你能否解释一下 cnts = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) 发生了什么) == 2 否则 cnts[1]
  • 看看this。本质上,cv2.RETR_EXTERNAL 是一个标志,简而言之,它告诉 OpenCV 只采用外部轮廓,没有内部轮廓。第二行抓取所有轮廓。根据 OpenCV 版本,findContours 将返回 2 或 3 个参数。因此该线根据返回的参数数量手动抓取轮廓
猜你喜欢
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
  • 2016-12-14
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多