我正试图用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)但是当使用银球程序时,我们没有得到任何结果。
当看程序计算出的边缘时,球的边缘是相当锋利的。但守则并没有识别任何球。

如何提高银球的检测率?我想出两种方法:-改进边缘计算,让圆检测接受边缘不清晰的图像,这是可能的吗?这样做的最佳方式是什么?
帮助是非常感谢的。
发布于 2018-04-04 13:01:17
你必须调整你的参数。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算法的变体。正如文档中所述,只有HOUGH_GRADIENT才是支持atm的。该方法利用了21 THE (p.2,2-1 HOUGH变换)算法。这个变体的主要优点在于减少了内存的使用。用hough变换检测圆的标准方法需要在三维hough空间(x,y和半径)中搜索。然而,21 the你的霍夫空间被减少到只有2维,这降低了相当数量的内存消耗。
dp
dp参数设置逆累加器分辨率。一个很好的解释可以找到这里。请注意,这个解释使用了标准的hough变换作为示例。但是21 But的效果是一样的。21 HT的累加器与标准的HT只是有点不同。
minDist
只需指定圆心之间的最小距离。在上面的代码示例中,它被设置为20,这意味着两个检测到的圆的中心必须是,至少是,距离对方20像素。我不知道opencv是如何过滤掉圆圈的,但是扫描源代码--它看起来像低匹配的圆圈被抛出了。
param1
指定传递给精明边缘算法的阈值。基本上,它被称为cv2.Canny(image, param1 / 2, param1)。
param2
这一段可能应该由更熟悉opencv源代码的人进行验证。param2指定累加器阈值。这个值决定了一个圆必须有多完整才能算作一个有效的圆圈。我不确定参数是在哪个单元中给出的。但是(再次扫描源代码)它看起来是一个绝对的投票阈值(这意味着它直接受到不同半径的影响)。下面的图片显示了不同的圆圈(或什么可以被识别为圆圈)。越往右走,阈值就越低,才能检测到那个圆圈。

minRadius和maxRadius
只需将圆圈搜索限制在半径的范围minRadius,maxRadius中。如果您能够近似(或知道)正在搜索的圆圈的大小,这是有用的(并且可以提高性能)。
https://stackoverflow.com/questions/49650772
复制相似问题