我正在尝试从数独板中提取数字。在检测到电路板,它的角落和变形后,我留下了一个只有电路板的漂亮的排列图像。 现在我正在尝试使用Tesseract android实现,Tess-Two来识别数字。 我将图像分割为9个部分
currentCell = undistortedThreshed.submat(rect);
其中rect
是围绕图像的矩形。
现在进行数字识别。
有些数字,如4,它完全可以识别。一些人,大多数是6,7,8,被认为是0或什么都没有。
我希望通过清除currentCell
图片尽可能多地帮助细分。此刻它看起来像这样
。 (也尝试没有倒置阈值)。我想摆脱白线(数独线)。
我尝试过这样的事情(取自here)
Imgproc.Canny(currentCell, currentCell, 80, 90);
Mat lines = new Mat();
int threshold = 50;
int minLineSize = 5;
int lineGap = 20;
Imgproc.HoughLinesP(currentCell, lines, 1, Math.PI / 180,
threshold, minLineSize, lineGap);
for (int x = 0; x < lines.cols() && x < 1; x++) {
double[] vec = lines.get(0, x);
double x1 = vec[0], y1 = vec[1], x2 = vec[2], y2 = vec[3];
Point start = new Point(x1, y1);
Point end = new Point(x2, y2);
Core.line(currentCell, start, end, new Scalar(255), 10);
}
但它没有绘制任何东西,我试着弄乱线条的宽度和颜色,但仍然没有。试图在大图像上绘制线条,在未图像的图像上,没有任何作用..
有什么建议吗?
修改
由于某种原因,它似乎找不到任何行。
这是将canny应用于之后的图像,但HoughLines
未检测到任何行。尝试使用不同的值HoughLines
和HoughLinesP
,如OpenCV文档中所示,但没有任何作用......
这些都很明显......我做错了什么?
谢谢!
答案 0 :(得分:2)
我最终做了不同的事情。
我使用findContours
获取最大轮廓,即数字。
使用boundingRect
获取其边界框。
使用submat
和voilla提取此内容。我只得到了数字。
不幸的是,它似乎没有任何区别。 Tesseract仍然无法正确识别数字。有时它没有给出结果,有时,在扩大数字之后它将6识别为0。 但这是另一个问题的问题。
答案 1 :(得分:0)
这是一个很好的想法:
保留用于计算图像中Hough Lines的代码。这意味着您可以获得与网格对应的行。
现在,只需在原始图像上绘制这些线条,但将颜色设置为黑色。
现在,大多数白线都会被新绘制的黑线覆盖。由于霍夫线位置与实际线不完全匹配,因此可能会留下一些小的白点。通过连接组件消除它们(并丢弃太小的组件)甚至是一些形态操作 - 注意实际数字保持不变 - 可以处理这些不完善之处。
尝试一下,让我知道。希望这会对你有所帮助。