编程语言
首页 > 编程语言> > java – HoughCircles发现错误的圈子(opencv)

java – HoughCircles发现错误的圈子(opencv)

作者:互联网

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

我要检测的图像:

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

解决方法:

嗯,恕我直言,霍夫圆检测算法正如它应该的那样工作.它正在检测圈子.

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

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

您可以使用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)

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

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

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

从线的极坐标中检测线,估计形成电话键盘的网格,然后在网格的左上角检测圆圈.

标签:java,opencv,hough-transform
来源: https://codeday.me/bug/20190629/1321649.html