【问题标题】:Passing image with OpenCV bounding boxes to tesseract OCR将带有 OpenCV 边界框的图像传递给 tesseract OCR
【发布时间】:2016-07-28 16:15:16
【问题描述】:

我正在尝试使用 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;
    }

我在使用边界框时获得了非常好的结果。带边界框的图像:

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

有人有想法吗?

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

【问题讨论】:

  • 你不能通过裁剪的图像吗?
  • 此代码中没有裁剪图像。它只检测文本区域,然后对它们进行轮廓/
  • 是的,我明白了...你不能在每个矩形上裁剪图像,然后将每个裁剪传递给 tesseract 吗?
  • 这正是我想要做的。我还没有找到任何文档或示例来帮助我做到这一点。大多数文档都说您可以将边界框作为参数传递给 openCv 中的 Tesseract,但我不知道该怎么做
  • 您可以从 OpenCV tesseract 中检索矩形,而不是将它们用作输入。当你有一个很好的检测时,只需调用tesseract->run(rgb(rect), output_string);.. 或类似的东西

标签: c++ opencv tesseract opencv3.0


【解决方案1】:

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

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

有关 windows 说明,请查看here

【讨论】:

    【解决方案2】:

    首先,感谢 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); (最好在您的 main 之前,但您可以将它放在任何位置,只要它位于此代码中的 for 循环之前)。该参数不是强制性的,因此您可以输入Ptr<cv::text::OCRTesseract> tess = cv::text::OCRTesseract::create();

      1. 现在您有了引擎。您可以运行 OCR。您可以使用许多参数运行它,但我将坚持使用基本参数:输入图像和输出文本。所以你现在可以添加这一行 tess->run(cropedImage, output_string); 就在这一行的下方 Mat cropedImage = small(Rect(rect));

    请注意,最好在将裁剪后的图像传递给 OCR 之前对其进行处理(阈值化为二进制图像,放大裁剪以使文本不接触边缘)

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 2015-08-04
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 2020-01-21
      相关资源
      最近更新 更多