【问题标题】:HoughCircles finds wrong circles (opencv)HoughCircles 发现错误的圆圈(opencv)
【发布时间】:2014-05-25 21:14:35
【问题描述】:

我有下面的图片,我真正想要检测的是框上方的圆圈,每个框的左上角都有字母。但结果是它还检测到了其他一些圆圈。我不知道为什么。

我要检测的图像:

http://imgur.com/8oKmhGp

结果如下:

http://imgur.com/qBw6YhK

如您所见,它有时可以找到字母为圆圈,也可以找到乐高上的圆圈。这是我的代码:

Mat source = Highgui.imread("testar.jpg", Highgui.CV_LOAD_IMAGE_COLOR);
            Mat destination = new Mat(source.rows(), source.cols(), source.type());

            Imgproc.cvtColor(source, destination, Imgproc.COLOR_RGB2GRAY);

            Imgproc.GaussianBlur(destination, destination, new Size(3,3),0,0); 


            Mat circles = new Mat();
            Imgproc.HoughCircles(destination, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 20, 10, 20, 7, 13);

            int radius;
            Point pt;
            for (int x = 0; x < circles.cols(); x++) {
            double vCircle[] = circles.get(0,x);

            if (vCircle == null)
                break;

            pt = new Point(Math.round(vCircle[0]), Math.round(vCircle[1]));
            radius = (int)Math.round(vCircle[2]);

            // draw the found circle
            Core.circle(destination, pt, radius, new Scalar(0,255,255), 3);
            Core.circle(destination, pt, 3, new Scalar(255,255,255), 3);
            }

            Highgui.imwrite("foundCircles.jpg", destination);

【问题讨论】:

  • 霍夫圆函数似乎按预期工作,因为它在您的测试图像中找到的只是某种圆。如果您对要查找的圆圈类型有更高的了解,则应该使用它(测试圆圈内有哪些颜色,圆圈内是否还有其他字母等)。
  • 抱歉,我觉得这很准确

标签: java opencv hough-transform


【解决方案1】:

嗯,恕我直言,霍夫圆检测算法的工作方式与预期完全一致。它正在检测圆圈。

但是,您似乎不想检测位于手机屏幕区域之外的圆圈。

如果您设法将手放在手机(或手机屏幕)四个角的确切坐标上,则可以实现一个简单的解决方案。

您可以使用 Rect 类来定义一个矩形块:

Rect cropRect = new Rect(topLeft_X, topLeft_Y, widthOfRectangle, heightOfRectangle);

然后使用这个矩形对象来重现一个新的图像矩阵(从原始图像矩阵),它只包含所需的区域:

Mat croppedImage = new Mat(inputImg, cropRect);

现在,有了新裁剪的图像,您可以通过 Paul Hough 先生的算法尽情享受所有乐趣。


现在,如果由于某种原因,您对如何获取手机四个角的坐标一无所知(即手机异想天开地移动),或者您对霍夫圆检测将 O 和 S 报告为圆,那么您可以尝试寻求任何好的 OCR 实施的帮助来帮助减轻您的痛苦。

由于您使用的是 Java,因此您可以使用 Tess4J。或者,您也可以尝试调整this project 来解出字符在手机屏幕中的位置。 (还有许多其他 OCR 可能会有所帮助,please refer to this website for an exhaustive list)

一旦你有了字符的确切位置,你可以尝试只在字符的左上角附近运行霍夫圆检测块。

请注意,OCR 在 Java 中往往有点讨厌和笨拙。


如果您仍然对结果不满意(或者如果 OCR 似乎会干扰您的新陈代谢),您可以尝试最后一种方法....霍夫线检测。

检测线条,从线条的极坐标,估计形成手机键盘的网格,然后在网格的左上角检测圆圈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多