【问题标题】:Find circles image processing查找圆圈图像处理
【发布时间】:2024-04-25 22:45:01
【问题描述】:

我正在使用 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。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • Mat 可以用作 OpenCV 中点向量的容器。大多数接受点向量的函数都将接受 Mat 并正常使用它。实际上,OpenCV 的几个版本之前的某些功能需要将向量转换为 Mat。但我同意使用 Mat 而不是 vector 有点令人困惑。
    • 我使用的是 Mat,因为该函数需要 Java 中的 Mat,而当我发现只有一个圆圈时,我在 Mat 中只得到了 3 个值。 @MichaelBurdinov
    【解决方案2】:

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

    使用 OpenCV 在 Zuma 中作弊? :)

    【讨论】:

      【解决方案3】:

      我已经测试了我的代码,它是用 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

      【讨论】:

      • 你好像有很多误报。