【问题标题】:How can i detect circles with color如何检测带颜色的圆圈
【发布时间】:2022-06-29 03:46:09
【问题描述】:

我想找到红色圆圈。我使用了 opencv2,简单的 Blob 检测器。当我在照片上应用蒙版时,找不到圆圈。它没有错误消息,只是找不到任何圈子。 这就是我得到的-> Founded_blobs。 我的测试照片 -> BlobTest4.jpg。我的代码如下。

import cv2
import numpy as np

img=cv2.imread("BlobTest4.jpg") 
rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

lower_red = np.array([95,0,0])
upper_red = np.array([255,90,90])

mask=cv2.inRange(rgb,lower_red,upper_red)

params = cv2.SimpleBlobDetector_Params()

params.filterByCircularity = True
params.minCircularity = 0.85

params.minThreshold = 1
params.maxThreshold = 2000

params.filterByArea = True
params.minArea = 33

params.filterByConvexity = True
params.minConvexity = 0.8

params.filterByInertia = True
params.minInertiaRatio = 0.01

blob=cv2.SimpleBlobDetector_create(params)
blob_coordinate=blob.detect(mask)
blob_coordinate_without_mask=blob.detect(img)

founded_blobs=cv2.drawKeypoints(mask,blob_coordinate,np.array([]),(0,255,0),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
founded_blobs_without_mask=cv2.drawKeypoints(img,blob_coordinate2,np.array([]),(0,255,0),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

cv2.namedWindow("mask",cv2.WINDOW_NORMAL)
cv2.namedWindow("founded_blobs_with_mask",cv2.WINDOW_NORMAL)
cv2.namedWindow("founded_blobs_without_mask",cv2.WINDOW_NORMAL)

cv2.imshow("founded_blobs_with_mask",founded_blobs)
cv2.imshow("founded_blobs_without_mask",founded_blobs_without_mask)
cv2.imshow("mask",mask)

cv2.waitKey(0)
cv2.destroyAllWindows

【问题讨论】:

  • 你在哪里设置了所有这些SimpleBlobDetector_Params 值,你明白你的意思吗?您是否尝试更改它们以查看效果?您是否尝试阅读文档以更好地理解它们?
  • 查看输出,它找到了圆圈/斑点,它们用绿色勾勒出来。这里有什么问题?

标签: python opencv mask


【解决方案1】:

我认为斑点检测可以检测到白色上的黑色。这就是为什么需要反转面具。

reversemask=255-mask
blob=cv2.SimpleBlobDetector_create(params)
blob_coordinate=blob.detect(reversemask)

这是一个工作代码。

import cv2
import numpy as np

img=cv2.imread("BlobTest4.jpg")
rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

lower_red = np.array([95,0,0])
upper_red = np.array([255,90,90])

hsvFrame = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

mask=cv2.inRange(rgb,lower_red,upper_red)
kernal = np.ones((5, 5), "uint8")

red_mask = cv2.dilate(mask, kernal)

params = cv2.SimpleBlobDetector_Params()

params.filterByCircularity = True
params.minCircularity = 0.85

params.minThreshold = 1
params.maxThreshold = 2000

params.filterByArea = True
params.minArea = 33

params.filterByConvexity = True
params.minConvexity = 0.8

params.filterByInertia = True
params.minInertiaRatio = 0.01

reversemask=255-mask

blob=cv2.SimpleBlobDetector_create(params)
blob_coordinate=blob.detect(reversemask)

blob_coordinate_without_mask=blob.detect(img)
print(blob_coordinate_without_mask)
print(blob_coordinate)
founded_blobs=cv2.drawKeypoints(red_mask,blob_coordinate,np.array([]),(0,255,0),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
founded_blobs_without_mask=cv2.drawKeypoints(img,blob_coordinate_without_mask,np.array([]),(0,255,0),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

cv2.namedWindow("mask",cv2.WINDOW_NORMAL)
cv2.namedWindow("founded_blobs_with_mask",cv2.WINDOW_NORMAL)
cv2.namedWindow("founded_blobs_without_mask",cv2.WINDOW_NORMAL)

cv2.imshow("founded_blobs_with_mask",founded_blobs)
cv2.imshow("founded_blobs_without_mask",founded_blobs_without_mask)
cv2.imshow("mask",mask)

cv2.waitKey(0)
cv2.destroyAllWindows

【讨论】:

    猜你喜欢
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多