我有以下图片,我真正想要检测的是方框上方的圆圈,每个方框的左上角都有字母。但结果是它还检测到其他一些圈子。我不知道为什么。
我想要检测的图片:
这就是结果:
正如你所看到的,它有时可以找到圆圈的字母,也可以找到乐高的圆圈。这是我的代码:
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);
答案 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检测。
从线条的极坐标中检测线条,估计构成手机键盘的网格,然后在网格的左上角检测圆圈。