使用OpenCV查找图像中的圆圈数

时间:2015-12-11 04:27:51

标签: python opencv image-processing computer-vision

我的图片如下:

Sample image with overlapping circles

任何人都可以告诉我如何检测其中的圆圈数量。我使用Hough circle变换来实现这一点,这是我的代码:

# import the necessary packages
import numpy as np
import sys
import cv2



# load the image, clone it for output, and then convert it to grayscale
image = cv2.imread(str(sys.argv[1]))
output = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# detect circles in the image
circles = cv2.HoughCircles(gray, cv2.cv.CV_HOUGH_GRADIENT, 1.2, 5)

no_of_circles = 0  
# ensure at least some circles were found
if circles is not None:
# convert the (x, y) coordinates and radius of the circles to integers
    circles = np.round(circles[0, :]).astype("int")
    no_of_circles = len(circles)

# loop over the (x, y) coordinates and radius of the circles
    for (x, y, r) in circles:
# draw the circle in the output image, then draw a rectangle
# corresponding to the center of the circle
        cv2.circle(output, (x, y), r, (0, 255, 0), 4)
        cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)

# show the output image

    cv2.imshow("output", np.hstack([image, output]))

print 'no of circles',no_of_circles

我为这段代码得到了错误的答案。任何人都可以告诉我哪里出错了?

5 个答案:

答案 0 :(得分:1)

这篇SO帖子描述了半圆的检测,对你来说可能是一个好的开始:

Detect semi-circle in opencv

如果您遇到OpenCV,请尝试自行编写解决方案。编写为您的特定应用程序参数化的霍夫圆圈查找器相对简单。如果您多次编写特定于应用程序的Hough算法,那么您应该能够在更短的时间内编写合理的解决方案,而不是通过对一堆谷歌搜索结果进行排序,破译别人的代码等等。 / p>

对于这样的图像,你绝对不需要Canny边缘检测,但它不会受到伤害。

其他库(特别是商业库)将允许您为Hough圈查找设置更多参数。我希望HoughCircle函数有一些重载,以允许传入搜索参数的结构,包括允许的圆完整性(弧长)的最小百分比。

虽然学习RANSAC和Hough技术很好 - 而且,随着时间的推移,使用更多异国情调的技术 - 当你对圆圈定义得如此美观和清晰时,我不一定会建议使用RANSAC。在没有提供具体证据的情况下,我只是声称摆弄RANSAC参数可能不如摆弄Hough参数那么直观。

答案 1 :(得分:0)

HoughCircles需要一些参数调整才能正常工作。 可能是在你的情况下,Param1和Param2的默认值(设置为100)不好。

答案 2 :(得分:0)

您可以使用HoughCircle通过计算最终侵蚀来微调您的检测。它会为您提供图像中的圆圈数。

答案 3 :(得分:0)

如果输入中只有圆圈和背景,您可以计算连接组件的数量,并忽略与背景相关的组件。这将是最简单,最强大的解决方案

答案 4 :(得分:0)

我尝试了一种检测所有圈子的棘手方法。

我手动找到了$this->set('conf', parent::getConfig()); 个参数

HoughCircles

棘手的部分是

HoughCircles( src_gray, circles, HOUGH_GRADIENT, 1, 50, 40, 46, 0, 0 );
在检测之前,

会创建如下的模型。

enter image description here

结果是这样的

enter image description here

c ++代码可以很容易地转换为python

flip( src, flipped, 1 );
hconcat( src,flipped, flipped );
hconcat( flipped, src, src );

flip( src, flipped, 0 );
vconcat( src,flipped, flipped );
vconcat( flipped, src, src );

flip( src, src, -1 );