2

我正在尝试使用OpenCV. 我已经设法使用cv::inRange()and创建了这个面具cv::Canny()

原始图像

在此处输入图像描述

面具

圆形面具

但是,当我cv::HoughCircles()只使用一些圆圈时,会被准确地检测到。目前,我正在使用cv::HoughCircles()以下参数:

cv::HoughCircles(mat, circles, CV_HOUGH_GRADIENT, 2, mat.rows / 256, 100, 8, 2, 8);

这种方法是否不足以检测如此小且靠近的圆圈,还是我只需要修改 cv::HoughCircles() 的参数?

此外,消除掩码中间圆阵列周围的“噪音”会很有用,因为在掩码边缘周围检测到一些“假圆”。有没有一种简单的方法可以做到这一点?

4

2 回答 2

3

摆脱噪音:

如果您可以确保始终具有相同的环境参数(例如与圆的距离、亮度...),那么您可以在 Canny 边缘检测之后使用cvAnd屏蔽您的图像;这是面具的样子:

在此处输入图像描述

霍夫圆检测:

现在,关于HoughCircle。首先,该函数执行自己的 Canny 边缘检测。在调用 HoughCircle 之前,您也在做一个。由于Canny 的工作方式(即二进制图像上的强度梯度......),它可能会对你的圆圈的形状产生影响。

说到你的圆圈的形状,下面是你的“圆圈”的特写;如果 HoughCircle 确实检测到了所有甚至只是其中的一部分,我会印象深刻。它不能在霍夫空间中提供任何好处。只是为了确保,将最后两个参数设置为 0(最小/最大半径),并尝试降低中心之间的最小距离。但老实说,我认为你需要找到另一种方法来解决你的问题。

[编辑]

一种可能的方法是执行连接组件标记(例如斑点检测)。据我所知,仅使用 OpenCV 是不可能做到这一点的,你需要像cvblob这样的东西,这是一个非常好的基于 OpenCV 的 blob 库。特别是,您可能对cvCentroid(CvBlob *blob).

干杯

在此处输入图像描述

于 2013-07-27T04:36:04.790 回答
1

嗯,你真的需要将它们检测为圆圈吗?(而不是将它们建模为圆圈)。

如果这是某种校准模式,并且您只对估计中心的图像位置感兴趣,那么首先将它们检测为点状特征可能会更有效,然后单独处理每个检测到的特征 - 例如拟合圈到每个检测到的特征附近的一团白色像素。

于 2013-07-27T18:53:52.290 回答