首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用OpenCV检测银球和反射球

用OpenCV检测银球和反射球
EN

Stack Overflow用户
提问于 2018-04-04 12:14:42
回答 1查看 2.8K关注 0票数 4

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

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

代码语言:javascript
复制
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)

但是当使用银球程序时,我们没有得到任何结果。

当看程序计算出的边缘时,球的边缘是相当锋利的。但守则并没有识别任何球。

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

帮助是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-04 13:01:17

你必须调整你的参数。HoughCircles函数在检测圆(即使有间隙)方面做得很好。注意,HoughCircles使用canny边缘检测执行内部二值化。因此,你不需要做脱粒。

考虑到上面的图像,代码

代码语言:javascript
复制
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()

产生结果

不同的参数意味着什么?

函数签名定义为

代码语言:javascript
复制
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中。如果您能够近似(或知道)正在搜索的圆圈的大小,这是有用的(并且可以提高性能)。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49650772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档