清洁图像以帮助在Android上进行测试

时间:2012-11-24 13:28:26

标签: java android opencv javacv

我正在尝试从数独板中提取数字。在检测到电路板,它的角落和变形后,我留下了一个只有电路板的漂亮的排列图像。 现在我正在尝试使用Tesseract android实现,Tess-Two来识别数字。 我将图像分割为9个部分

currentCell = undistortedThreshed.submat(rect);

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

现在进行数字识别。

有些数字,如4,它完全可以识别。一些人,大多数是6,7,8,被认为是0或什么都没有。

我希望通过清除currentCell图片尽可能多地帮助细分。此刻它看起来像这样 Inverted 6。 (也尝试没有倒置阈值)。我想摆脱白线(数独线)。 我尝试过这样的事情(取自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应用于6 after canny之后的图像,但HoughLines未检测到任何行。尝试使用不同的值HoughLinesHoughLinesP,如OpenCV文档中所示,但没有任何作用...... 这些都很明显......我做错了什么? 谢谢!

2 个答案:

答案 0 :(得分:2)

我最终做了不同的事情。

我使用findContours获取最大轮廓,即数字。

使用boundingRect获取其边界框。

使用submat和voilla提取此内容。我只得到了数字。

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

答案 1 :(得分:0)

这是一个很好的想法:

保留用于计算图像中Hough Lines的代码。这意味着您可以获得与网格对应的行。

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

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

尝试一下,让我知道。希望这会对你有所帮助。