5

我正在尝试从数独板上提取数字。在检测到电路板、它的角并进行转换后,我只剩下一个漂亮的、排列整齐的电路板图像。现在我正在尝试使用 Tesseract android 实现 Tess-Two 来识别数字。我将图像分成 9 个部分

currentCell = undistortedThreshed.submat(rect);

其中rect是围绕图像的矩形。

现在到数字识别。

有些数字,比如 4,它可以完美识别。一些,主要是 6、7、8 被识别为 0 或什么都没有。

currentCell我想通过清理图像来尽可能多地帮助 tesseract 。目前它看起来像这样 倒 6。(也尝试过不使用倒置阈值)。我想摆脱白线(数独线)。我试过这样的东西(取自这里

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 后的样子,6 精明之后HoughLines没有检测到任何线条。如OpenCV文档中所示,尝试了两者HoughLinesHoughLinesP使用不同的值,但没有任何效果......这些都是非常明显的线条......我做错了什么?谢谢!

4

2 回答 2

3

我最终做了一些不同的事情。

我曾经findContours得到最大的轮廓,即数字。

通过使用得到它的边界框boundingRect

使用submat和voilla提取了这个。我只得到了数字。

不幸的是,它似乎根本没有任何区别。Tesseract 仍然无法正确识别数字。有时它没有给出任何结果,有时,在扩大数字后它会将 6 识别为 0。但这是另一个问题的问题。

于 2012-11-26T05:18:34.780 回答
1

这是我脑海中的一个想法:

将计算霍夫线的代码保留在图像中。这意味着您可以获得与网格对应的线条。

现在,只需在原始图像上绘制这些线条,但将颜色设置为黑色。

大多数白线现在将被新绘制的黑线覆盖。由于霍夫线位置与实际线不完全匹配,因此可能会保留一些小白点。通过连接组件(并丢弃太小的组件)甚至一些形态学操作来消除它们 - 注意实际数字保持不变 - 可以处理这些缺陷。

试试看,让我知道。希望这对您有所帮助。

于 2012-11-25T02:20:27.893 回答