查找圆形图像处理

时间:2013-11-14 17:11:08

标签: java opencv image-processing geometry hough-transform

我正在使用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());

但是我得到一个空的Mat,用于得到和没有模糊的结果。 我该如何修复此代码?

enter image description here

编辑: 嗨伙计们!

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

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

我在检测前仍然使用medianBlur。

唯一的问题是为什么它会检测到这些小圆圈?我已经附上了精确检测的结果,我认为这些圆圈很容易看到。

enter image description here enter image description here

3 个答案:

答案 0 :(得分:2)

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

使用OpenCV在祖玛作弊? :)

答案 1 :(得分:2)

首先,circles结构不应该是cv::Mat,而应该是std::vector<cv::Vec3f>;我认为这就是为什么你没有得到任何结果..请参阅HoughCircles上的文档了解详情..

使用5分钟的值,我有这个起点:

enter image description here

我使用的参数是,

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。 :)

答案 2 :(得分:1)

我测试了我的代码,它在C#中写了(我认为java是相同的)并得到结果:1

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

    //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