使用OpenCV边界框传递图像以测试OCR

时间:2016-04-07 16:24:30

标签: c++ opencv tesseract opencv3.0

我正在尝试使用OpenCV和Tesseract从图像中提取文本。我已设法检测文本区域并使用边界框来分隔它们。但现在我找不到如何将边界框传递给Tesseract。

        for(int idx = 0; idx >= 0; idx = hierarchy[idx][0])
        {
            Rect rect = boundingRect(contours[idx]);
            Mat maskROI(mask, rect);
            maskROI = Scalar(0, 0, 0);
            // fill the contour
            drawContours(mask, contours, idx, Scalar(255, 255, 255), CV_FILLED);
            // ratio of non-zero pixels in the filled region
            double r = (double)countNonZero(maskROI)/(rect.width*rect.height);

            if (r > .45 /* assume at least 45% of the area is filled if it contains text */
                &&
                (rect.height > 8 && rect.width > 8) /* constraints on region size */
                /* these two conditions alone are not very robust. better to use something
                 like the number of significant peaks in a horizontal projection as a third condition */
                )
            {
                rectangle(rgb, rect, Scalar(0, 255, 0), 2);
            }
        }
        imwrite(OUTPUT_FOLDER_PATH + string("/rgb.jpg"), rgb);
    return 0;
    }

我用边界框得到了非常好的结果。带有边界框的图像:

enter image description here

然后尝试cv::text::OCRTesseract::run,但这似乎不起作用。

有人有想法吗?

编辑:我不得不删除大部分代码,因为我正在实习的公司问我。但这是我今年年底的项目,所以一旦我结束这一年,我将用整个项目的github链接编辑帖子。

2 个答案:

答案 0 :(得分:3)

首先,感谢miki的帮助。这就是我为解决这个问题所做的工作。

  1. 裁剪每个边框的原始图像。这将为我提供图像中许多文本区域的单独图像。要执行此操作,只需将Mat cropedImage = small(Rect(rect));放在此行rectangle(rgb, rect, Scalar(0, 255, 0), 2);

  2. 创建OCRTesseract类的实例并初始化tesseract引擎。要执行此操作,请添加此行Ptr<cv::text::OCRTesseract> tess = cv::text::OCRTesseract::create(NULL,NULL,NULL,3,3);(最好在您的主要行之前,但您可以将它放在任何地方,只要它在此代码中的for循环之前)。该参数不是必需的,因此您只需放置Ptr<cv::text::OCRTesseract> tess = cv::text::OCRTesseract::create();

    1. 现在你有了引擎。您可以运行OCR。您可以使用许多参数运行它,但我将坚持使用基本参数:输入图像和输出文本。因此,您现在可以在此tess->run(cropedImage, output_string);
    2. 下方添加此行Mat cropedImage = small(Rect(rect));
  3. 请注意,最好在将裁剪后的图像传递给OCR之前对其进行处理(阈值处理为二值图像,放大裁剪,使文字不会碰到边缘)

答案 1 :(得分:0)

在使用cv :: text :: OCRTesseract :: run之前,您需要OpenCV额外模块。您可以从here下载相同的内容。

该页面底部的教程将告诉您如何在Linux上安装它们,以便与OpenCV一起使用。根据我的记忆,您需要在安装OpenCV期间构建它们。这些模块也仅适用于OpenCV3。

对于Windows说明,请查看here