Python 用OpenCV检测银球和反射球

Python 用OpenCV检测银球和反射球,python,opencv,hough-transform,Python,Opencv,Hough Transform,我试图用OpenCV检测反映环境的银球: 对于黑球,我通过探测圆圈成功地做到了: gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray,(5,5),0); gray = cv2.medianBlur(gray,5) gray = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11

我试图用OpenCV检测反映环境的银球:

对于黑球,我通过探测圆圈成功地做到了:

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

gray = cv2.GaussianBlur(gray,(5,5),0);
gray = cv2.medianBlur(gray,5)

gray = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,3.5)

kernel = np.ones((3,3),np.uint8)

gray = cv2.erode(gray,kernel,iterations = 1)

gray = cv2.dilate(gray,kernel,iterations = 1)

circles = cv2.HoughCircles(gray, cv.CV_HOUGH_GRADIENT, 1, 260, \
                    param1=30, param2=65, minRadius=0, maxRadius=0)
但是当使用银球程序时,我们没有得到任何结果

当查看程序计算的边时,球的边非常锋利。但代码不能识别任何球

如何提高银球的检出率?我认为有两种方法可以做到这一点: -改进边缘计算 -使圆检测接受边缘不清晰的图像 可能吗?这样做的最佳方式是什么


非常感谢您的帮助。

您必须调整参数。HoughCircles函数可以很好地检测圆(即使有间隙)。请注意,HoughCircles使用canny边缘检测执行内部二值化。因此,您不必进行阈值处理

根据上面的图片,代码

import cv2
from matplotlib import pyplot as plt
import numpy as np

PATH = 'path/to/the/image.jpg'    

img = cv2.imread(PATH, cv2.IMREAD_GRAYSCALE)
plt.imshow(img, cmap='gray')
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20, param1=130, param2=30, minRadius=0, maxRadius=0)
if circles is not None:
    for x, y, r in circles[0]:
        c = plt.Circle((x, y), r, fill=False, lw=3, ec='C1')
        plt.gca().add_patch(c)
plt.gcf().set_size_inches((12, 8))
plt.show()
产生结果

不同的参数意味着什么? 函数签名定义为

cv.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]])
图像圆圈是自解释的,将被跳过

方法 指定内部使用的hough算法的变体。如中所述,仅支持atm。该方法利用了该算法。这种变体的主要优点在于减少了内存使用。使用hough变换检测圆的标准方法需要在3D hough空间(x、y和半径)中进行搜索。然而,使用21HT,您的hough空间仅减少到2维,这将相当大程度地降低内存消耗

数据处理 dp参数设置反向累加器分辨率。可以找到一个很好的解释。请注意,此说明使用标准hough变换作为示例。但21HT的效果是相同的。21HT的累加器与标准HT的累加器略有不同

心灵主义者 仅指定圆心之间的最小距离。在上面的代码示例中,它被设置为20,这意味着两个检测到的圆的中心必须至少相距20个像素。我不确定opencv是如何过滤掉这些圆圈的,但扫描源代码时,看起来匹配度较低的圆圈被扔掉了

参数1 指定传递给算法的阈值。基本上它被称为cv2.Canny(image,param1/2,param1)

参数2 这一段应该由更熟悉opencv源代码的人来验证。 param2指定累加器阈值。此值决定圆必须完成的程度,才能算作有效圆。我不确定参数是以哪个单位给出的,tho。但是(再次扫描源代码)它看起来像是一个绝对投票阈值(意味着它直接受到不同半径的影响)。 下图显示了不同的圆(或可以识别为圆的圆)。越往右转,阈值越低,才能检测到该圆

最小半径和最大半径
只需将圆搜索限制在半径的[minRadius,maxRadius]范围内。如果您可以近似(或知道)正在搜索的圆的大小,这是非常有用的(并且可以提高性能)。

如果您的背景具有代表性,那么您可能需要尝试检测特定颜色,这将为您提供相当多的球开始。1.转换为HSV。对于您的特定颜色范围,请使用InRange。您的参数是否与相同大小的合成圆匹配?您是否尝试过其他边缘检测方法以获得更好的闭合轮廓?()您介意发布这些参数文档的链接吗?(或者更好:解释一下?)谢谢。你读过
cv2.HoughCircles
?我想我们会在那里解释的,但是如果你不理解的话,我可以说得更详细。如果你能说得更详细,那就太好了,我想我没有完全理解文档。