我的图片如下:
任何人都可以告诉我如何检测其中的圆圈数量。我使用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
我为这段代码得到了错误的答案。任何人都可以告诉我哪里出错了?
答案 0 :(得分:1)
这篇SO帖子描述了半圆的检测,对你来说可能是一个好的开始:
如果您遇到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 );
在检测之前,会创建如下的模型。
结果是这样的
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 );