使用OpenCV边框传递图像给tesseract OCR

3

我正在尝试使用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链接。

你不能传递裁剪后的图像吗? - Miki
是的,我明白了... 你不能在每个矩形上裁剪图像,然后将每个裁剪后的图像传递给tesseract吗? - Miki
这正是我要做的事情。我没有找到任何文档或示例来帮助我完成它。 大多数文档都说你可以将边界框作为参数传递给openCv中的Tesseract,但我找不到如何实现它。 - user3491634
你可以从OpenCV Tesseract中检索矩形,而不是将它们用作输入。当你有一个良好的检测结果时,只需调用tesseract->run(rgb(rect), output_string);之类的代码即可。 - Miki
你需要正确地创建对象。类似这样:Ptr<OCRTesseract> tess = OCRTesseract::create(...); tess->run(...) - Miki
显示剩余8条评论
2个回答

5
首先,感谢miki的帮助。这是我为解决此问题所做的操作。
1. 为每个边框切割原始图像。这将为图像中许多文本区域提供单独的图像。要执行此操作,只需在此行下方rectangle(rgb, rect, Scalar(0, 255, 0), 2);放置Mat cropedImage = small(Rect(rect));即可。
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();
3. 现在您已经拥有了引擎。您可以运行OCR。您可以使用许多参数来运行它,但我将坚持基本参数:输入图像和输出文本。因此,您现在可以在此行下方Mat cropedImage = small(Rect(rect));添加此行tess->run(cropedImage,output_string);
请注意,在传递图像到OCR之前,最好对裁剪图像进行处理(二值化处理,扩大裁剪区域以使文本不接触边缘)。

0

在使用cv::text::OCRTesseract::run之前,您需要安装OpenCV的额外模块。您可以从这里下载相应的模块。

该页面底部的教程将告诉您如何在Linux上安装它们,并与您的OpenCV一起使用。但是我记得,在安装OpenCV时,您需要构建它们。此外,这些模块仅适用于OpenCV3。

有关Windows说明,请查看这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接