2

我正在使用 opencv 和 java 在图像上查找圆圈,到目前为止我有下面的图像。我正在使用 Hough 来查找带有如下代码的圆圈:

    Imgproc.medianBlur(result, result, 3);
    Imgproc.medianBlur(result, result, 3);
    Imgproc.medianBlur(result, result, 3);
    Mat circles = new Mat();
    Imgproc.HoughCircles(result, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 1, 200, 100, 30, 40);
    System.out.println(circles.dump());

但是我得到了一个空的垫子,无论有没有模糊。我应该如何修复此代码?

在此处输入图像描述

编辑: 大家好!

谢谢你,我现在有了这张照片。我正在使用这些参数:

Imgproc.HoughCircles(result, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 20, 50, 10, 10, 40);

在检测之前,我仍在使用 medianBlur。

剩下的唯一问题是为什么它会检测到这些小圆圈?我附上了精明检测的结果,我认为圆圈很明显。

在此处输入图像描述 在此处输入图像描述

4

3 回答 3

2

你确定你提供的是半径而不是直径吗?尝试更大范围的半径(例如 10-100)。

使用 OpenCV 在 Zuma 中作弊?:)

于 2013-11-14T17:42:19.380 回答
2

首先,circles结构不应该,cv::Mat但应该是std::vector<cv::Vec3f>;我认为这就是您没有得到任何结果的原因。有关详细信息,请参阅HoughCircles上的文档。

玩弄这些值 5 分钟,我为您准备了以下起点:

在此处输入图像描述

我使用的参数是,

cv::medianBlur(test_Circle, test_Circle, 7);
std::vector<cv::Vec3f> circles; // <- not that "circles" is not cv::Mat
cv::HoughCircles(test_Circle, circles, CV_HOUGH_GRADIENT, 1, 1, 300, 10, 10, 50);

稍微玩弄一下这些值后,您可以获得更明确的结果。

PS - 由于我是 C++ 用户,请原谅我将我所有的结构都采用这种格式。您可以轻松地将逻辑扩展到 Java。:)

于 2013-11-14T19:28:36.630 回答
1

我已经测试了我的代码,它是用 C# 编写的(我认为 java 是一样的)并得到结果:1

您可以在 HoughAlgorithm.cs 类我的演示项目中找到我的代码

    //DP_Resolution: 1
//MinDistance :32
//CannyThreshold: 10
//AccuThreshold: 10
//MinRadius: 13
//MaxRadius: 20

public static CvSeq DetectCircles(IplImage pImage, CamEnum _camName)
{
    try
    {
        CvMemStorage memStorage = cvlib.CvCreateMemStorage(0);
        return cvlib.CvHoughCircles(ref pImage, memStorage.ptr, 3, 1, 32, 10, 10, 13, 20);
    }
    catch
    {
        throw;
    }
}

http://i.stack.imgur.com/pUqbh.png

于 2016-07-31T14:30:45.233 回答