- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图在我的图像中检测包含圆点的圆圈,但不幸的是我无法这样做。我正在使用 opencv HoughTransform,但找不到使它起作用的参数。
src = imread("encoded.jpg",1);
/// Convert it to gray
cvtColor(src, src_gray, CV_BGR2GRAY);
vector<Vec3f> circles;
/// Apply the Hough Transform to find the circles
HoughCircles(src_gray, circles, CV_HOUGH_GRADIENT, 1, 10,
100, 30, 1, 30 // change the last two parameters
// (min_radius & max_radius) to detect larger circles
);
/// Draw the circles detected
for (size_t i = 0; i < circles.size(); i++)
{
cout << "Positive" << endl;
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
// circle center
circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0);
// circle outline
circle(src, center, radius, Scalar(0, 0, 255), 3, 8, 0);
}
/// Show your results
namedWindow("Hough Circle Transform Demo", CV_WINDOW_AUTOSIZE);
imshow("Hough Circle Transform Demo", src_gray);
waitKey(0);
为什么 HoughCircles 无法检测到此图像中的圆圈?它似乎正在处理其他更简单的图像,例如电路板图像。
最佳答案
关键在于对 HoughCircles 正在做什么有足够的直觉,这样您就可以构建一个程序,为您想要在其中找到圆圈的所有各种图像自动调整超参数。
核心问题,一些直觉
HoughCircles 并不是独立存在的,尽管它表明它可能具有最小和最大半径参数,但您需要运行数百或数千次迭代才能在正确的设置中自动调整和自动拨号。然后在你完成之后你需要后处理验证步骤来 100% 确定这个圆是你想要的。问题是您正在尝试通过猜测和检查来手动调整 HoughCircles 的输入参数。那根本行不通。让计算机为您自动调整这些参数。
HoughCircles 的手动调整什么时候可以令人满意?
如果您想手动对参数进行硬编码,那么您绝对需要做的一件事就是将圆的精确半径控制在一两个像素以内。您可以猜测 dp 分辨率并设置累加器数组投票阈值,您可能没问题。但是,如果您不知道半径,则 HoughCircles 输出将毫无用处,因为它要么到处都找不到圆,要么找不到任何地方。假设您确实手动找到了一个可接受的调整,您向它展示了几个像素不同的图像,并且您的 HoughCircles 吓坏了并在图像中找到了 200 个圆圈。毫无值(value)。
有希望:
希望来自于 HoughCircles 即使在大图像上也非常快的事实。您可以为 HoughCircles 编写一个程序来完美地自动调整设置。如果您不知道半径并且它可能很小或很大,您可以从一个很大的“最小距离参数”、一个非常好的 dp 分辨率和一个非常高的投票阈值开始。因此,当您开始迭代时,HoughCircles 可以预见地拒绝找到任何圈子,因为设置过于激进并且投票没有清除阈值。但是循环会不断迭代并逐步达到最佳设置,让最佳设置成为表明您已完成的避雷针。您找到的第一个圆圈将是图像中像素完美的最大和最佳圆圈,HoughCircles 会给您留下一个像素完美的圆圈,就在它应该出现的位置。只是您必须运行它 5000 次。
示例 python 代码(抱歉不是 C++):
它的边缘仍然很粗糙,但您应该能够将其清理干净,以便在一秒钟内获得令人满意的像素完美效果。
import numpy as np
import argparse
import cv2
import signal
from functools import wraps
import errno
import os
import copy
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True, help = "Path to the image")
args = vars(ap.parse_args())
# load the image, clone it for output, and then convert it to grayscale
image = cv2.imread(args["image"])
orig_image = np.copy(image)
output = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("gray", gray)
cv2.waitKey(0)
circles = None
minimum_circle_size = 100 #this is the range of possible circle in pixels you want to find
maximum_circle_size = 150 #maximum possible circle size you're willing to find in pixels
guess_dp = 1.0
number_of_circles_expected = 1 #we expect to find just one circle
breakout = False
#hand tune this
max_guess_accumulator_array_threshold = 100 #minimum of 1, no maximum, (max 300?) the quantity of votes
#needed to qualify for a circle to be found.
circleLog = []
guess_accumulator_array_threshold = max_guess_accumulator_array_threshold
while guess_accumulator_array_threshold > 1 and breakout == False:
#start out with smallest resolution possible, to find the most precise circle, then creep bigger if none found
guess_dp = 1.0
print("resetting guess_dp:" + str(guess_dp))
while guess_dp < 9 and breakout == False:
guess_radius = maximum_circle_size
print("setting guess_radius: " + str(guess_radius))
print(circles is None)
while True:
#HoughCircles algorithm isn't strong enough to stand on its own if you don't
#know EXACTLY what radius the circle in the image is, (accurate to within 3 pixels)
#If you don't know radius, you need lots of guess and check and lots of post-processing
#verification. Luckily HoughCircles is pretty quick so we can brute force.
print("guessing radius: " + str(guess_radius) +
" and dp: " + str(guess_dp) + " vote threshold: " +
str(guess_accumulator_array_threshold))
circles = cv2.HoughCircles(gray,
cv2.HOUGH_GRADIENT,
dp=guess_dp, #resolution of accumulator array.
minDist=100, #number of pixels center of circles should be from each other, hardcode
param1=50,
param2=guess_accumulator_array_threshold,
minRadius=(guess_radius-3), #HoughCircles will look for circles at minimum this size
maxRadius=(guess_radius+3) #HoughCircles will look for circles at maximum this size
)
if circles is not None:
if len(circles[0]) == number_of_circles_expected:
print("len of circles: " + str(len(circles)))
circleLog.append(copy.copy(circles))
print("k1")
break
circles = None
guess_radius -= 5
if guess_radius < 40:
break;
guess_dp += 1.5
guess_accumulator_array_threshold -= 2
#Return the circleLog with the highest accumulator threshold
# ensure at least some circles were found
for cir in circleLog:
# convert the (x, y) coordinates and radius of the circles to integers
output = np.copy(orig_image)
if (len(cir) > 1):
print("FAIL before")
exit()
print(cir[0, :])
cir = np.round(cir[0, :]).astype("int")
# loop over the (x, y) coordinates and radius of the circles
if (len(cir) > 1):
print("FAIL after")
exit()
for (x, y, r) in cir:
# 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, 0, 255), 2)
cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)
# show the output image
cv2.imshow("output", np.hstack([orig_image, output]))
cv2.waitKey(0)
因此,如果您运行它,它需要 5 秒的时间,但它几乎达到了像素完美(自动调谐器的进一步手动调整使其达到亚像素完美):
对此:
使这项工作成功的秘诀在于您在开始之前拥有多少信息。如果您知道半径到某个公差(例如 20 像素),那么您就完成了。但如果你不这样做,你必须聪明地知道你如何通过仔细接近决议和投票阈值来爬上最大选票的半径。如果圆圈形状怪异,则dp分辨率需要更高,投票阈值需要探索更低的范围。
关于c++ - HoughCircles 无法在此图像上检测到圆圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38048265/
目录 1. 效果图 2. 源码 参考 这篇博客将学习如何使用霍夫圆变换在图像中找到圆圈,OpenCV使用cv2.HoughCircles()实现霍夫圆变
我正在尝试使用 android-opencv 2.3.1 来识别图像中的圆圈(硬币)。然而,执行方法 Imgproc.cvtColor 时发生错误(org.opencv.cvException)。 F
有没有一种方法可以使圆检测无参数? - 为什么 cv2.HoughCircles() 中的参数在更改后有时不会受到影响?我有一个 for 循环来改变参数,但它不会一直影响结果。 Hough Circl
通过将图像转换为灰度然后对其进行模糊处理来处理图像后,我尝试使用这些参数应用霍夫圆变换: CV_HOUGH_GRADIENT dp = 1 最小距离 = 1 参数_1 = 70 参数_2 = 100
我正在使用 Xcode 和 C++ 我已经从 OpenCV documentation 中复制了 HoughCircles 代码: #include #include #include usin
我试图在我的图像中检测包含圆点的圆圈,但不幸的是我无法这样做。我正在使用 opencv HoughTransform,但找不到使它起作用的参数。 src = imread("encoded.jpg",
我试图使用 OpenCV HoughCircles 函数,但我得到了这个错误。 这是我的代码: rows = image.shape[0] circles = cv2.HoughCircles(out
我正在使用 float32 类型的 128 x 128 数组。这些数组是从二进制文件中提取的,我试图在每个数组中定位磁盘。 当我尝试使用 HoughCircles 示例代码时: img = Image
我正在编写一个脚本来自动检测一组照片上的一些圆圈。我可能已经阅读了有关 HoughCircles on Stack 的所有问题,推荐的方法通常似乎是蛮力半径间隔和累加器阈值(即 param2)。半径循
我试图在图像中定位一些彩色球,为了减少误报的风险,我首先根据当前正在搜索的球的颜色将图像缩小为二值图像。 OpenCV 的 HoughCircles 无法在二值图像中找到任何圆圈, 同时在转换为灰度的
我正在检测图像中的循环 这是我的代码: import cv2 import cv2.cv as cv import numpy as np img = cv2.imread('a1.png',0) i
我使用 OpenCV 帮助我检测从 iPhone 相机拍摄的图像中的硬币。我正在使用 HoughCircles 方法帮助我找到它们,但结果并不乐观。 cv::Mat greyMat; cv::
我刚刚在 opencv 上学习了一个关于圆圈检测的例子 http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_circle/hough
我无法在图像上绘制圆圈。你能检查一下吗?问题出在绘制圆圈时,我无法检索在图像上找到的圆圈的半径和中心。提前致谢。 代码:(Python) import cv,cv2 import numpy as n
我在 Anaconda Navigator 上使用“OpenCV 版本:3.4.0”和 Python 3.6 以及 Spyder IDE (Spyder 3.2.4)。 当我使用这些参数调用 Houg
我正在实现一个函数来检测图像中的圆圈。我正在使用 Java 的 OpenCV 来识别圆圈。灰度图像确实显示了一个圆圈。 这是我的代码: Mat gray = new Mat(); Imgproc.cv
我需要进行快速准确的圆检测,所以我认为使用 OpenCV 的 Hough Circle 是一个不错的选择。不幸的是,无论我给它的图像有多好以及我调整了多少参数,它都拒绝检测图像中的所有圆圈。这是我的输
我正在尝试使用 OpenCV,更具体地说是它的 HoughCircles 来检测和测量瞳孔和虹膜,目前我一直在使用函数中的一些变量,因为它要么返回 0 个圆圈,要么返回过多的圆圈.下面是我正在使用的代
我想使用 OpenCV 和 C++ 检测图像中的圆圈。我可以通过引用 official documentation 来做到这一点调整OpenCV Team编写的那段代码的参数。 所以,我正在使用的代码
我有一个包含 5 个油滴的视频,我正在尝试使用 cv2.HoughCircles 来找到它们。 这是我的代码: import cv, cv2 import numpy as np foreground
我是一名优秀的程序员,十分优秀!