霍夫圆变换(HoughCircles)找到了错误的圆(OpenCV)

4
我有以下图片,实际上我想检测的是盒子上方带有字母的圆圈。但结果是它也检测到了其他一些圆圈。我不知道为什么。
我要检测的图像:

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);

Hough圆函数似乎按照预期工作,因为它在测试图像中找到的都是某种圆。如果你对想要找到的圆有更高级别的知识,应该使用它(测试圆内有哪些颜色,圆内是否有其他字母等)。 - Micka
抱歉,那看起来对我非常准确。 - Sam Creamer
1个回答

3

我认为,霍夫圆检测算法正在按照预期工作。它确实在检测圆。

然而,似乎您不想检测手机屏幕范围之外的圆。

如果您能够获取手机(或移动屏幕)四个角落的确切坐标,则可以实现简单的解决方案。

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

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

然后使用这个矩形对象来复制一个新的图像矩阵(从原始矩阵中)只包含所需区域:
Mat croppedImage = new Mat(inputImg, cropRect);

现在,有了你旁边新鲜裁剪的图像,您可以尽情玩耍Mr. Paul Hough的算法。
现在,如果由于某种原因,您不知道如何获取手机四个角的坐标(即,手机随意移动),或者您对Hough圆检测将O和S报告为圆形感到非常恼火,那么您可以尝试寻求任何优秀的OCR实现的帮助来缓解您的痛苦。
由于您使用的是Java,您可以使用Tess4J。或者,您可以尝试调整this project以提取移动屏幕上字符的位置。(还有许多其他OCR可能会有所帮助,请参考此网站以获取详尽的列表
一旦您获得了字符的确切位置,您可以尝试仅在字符左上角附近运行Hough Circle检测块。 不过,请注意,OCR在Java中往往有些棘手和难以驾驭。
如果您对结果仍然不满意(或者OCR似乎干扰了您的新陈代谢),则还有一种最后的方法可以尝试...霍夫线检测。
检测线条,从线条的极坐标估计形成手机键盘的网格,然后在网格左上角检测圆圈。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接