HoughCircles发现错误的圈子(opencv)

时间:2014-05-25 21:14:35

标签: java opencv hough-transform

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

我想要检测的图片:

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

1 个答案:

答案 0 :(得分:3)

嗯,恕我直言,Hough Circle检测算法的工作方式完全符合预期。它正在检测圈子。

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

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

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

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

然后使用此矩形对象重现仅包含所需区域的新图像矩阵(来自原始图像矩阵):

Mat croppedImage = new Mat(inputImg, cropRect);

现在,通过您身边的新裁剪图像,您可以使用Paul Hough先生的算法获得您想要的所有乐趣。


现在,如果出于某种原因,事实证明你没有任何关于如何获得手机四角坐标的线索(即手机异想天开),或者你该死的霍夫圈检测报告了O和圈子的烦恼,然后你可以尝试寻求任何好的OCR实施的帮助,以帮助减轻你的痛苦。

由于您使用的是Java,因此可以使用Tess4J。或者,您可以尝试调整this project来解除移动屏幕中角色的位置。 (还有许多其他OCR可能有所帮助,please refer to this website for an exhaustive list

一旦掌握了字符的确切位置,您可以尝试在字符左上角附近运行Hough Circle检测块。

但需要注意的一点是,OCR在Java中往往有点讨厌和笨拙。


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

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