转换cv :: Mat for tesseract

Ped*_*dro 15 c++ opencv tesseract

我正在使用OpenCV来提取扫描文档的子图像,并希望使用tesseract对此子图像执行OCR.

我发现我可以在tesseract中使用两种方法进行文本识别,但到目前为止我还是找不到可行的解决方案.

A.)如何将a cv::Mat转换为PIX* (PIX*是leptonica的数据类型)

基于下面的vasiles代码,这基本上是我当前的代码:

 cv::Mat image = cv::imread("c:/image.png"); 
 cv::Mat subImage = image(cv::Rect(50, 200, 300, 100)); 

 int depth;
 if(subImage.depth() == CV_8U)
    depth = 8;
 //other cases not considered yet

 PIX* pix = pixCreateHeader(subImage.size().width, subImage.size().height, depth);
 pix->data = (l_uint32*) subImage.data; 

 tesseract::TessBaseAPI tess;
 STRING text; 
 if(tess.ProcessPage(pix, 0, 0, &text))
 {
    std::cout << text.string(); 
 }   
Run Code Online (Sandbox Code Playgroud)

虽然它没有崩溃或任何事情,但OCR结果仍然是错误的.它应该识别我的示例图像中的一个单词,但它会返回一些不可读的字符.

该方法PIX_HEADER不存在,所以我使用了pixCreateHeader,但它没有将通道数作为参数.那我怎样才能设置频道数量?

B.)我如何使用cv::MatTesseractRect()

Tesseract提供了另一种使用此签名进行文本识别的方法:

char * TessBaseAPI::TesseractRect   (   
    const UINT8 *   imagedata,
    int     bytes_per_pixel,
    int     bytes_per_line,
    int     left,
    int     top,
    int     width,
    int     height   
)   
Run Code Online (Sandbox Code Playgroud)

目前我使用以下代码,但它也返回不可读的字符(虽然不同于上面的代码.

char* cr = tess.TesseractRect(
           subImage.data, 
           subImage.channels(), 
           subImage.channels() * subImage.size().width, 
           0, 
           0, 
           subImage.size().width, 
           subImage.size().height);   
Run Code Online (Sandbox Code Playgroud)

Ped*_*dro 16

tesseract::TessBaseAPI tess; 
cv::Mat sub = image(cv::Rect(50, 200, 300, 100));
tess.SetImage((uchar*)sub.data, sub.size().width, sub.size().height, sub.channels(), sub.step1());
tess.Recognize(0);
const char* out = tess.GetUTF8Text();
Run Code Online (Sandbox Code Playgroud)


Tar*_*hah 5

对于使用 OpenCV/Tesseract 的 JavaCPP 预设的任何人,这里是有效的

Mat img = imread("file.jpg");
Mat gray = new Mat();
cvtColor(img, gray, CV_BGR2GRAY);

// api is a Tesseract client which is initialised

api.SetImage(gray.data().asBuffer(),gray.size().width(),gray.size().height(),gray.channels(),gray.size1())
Run Code Online (Sandbox Code Playgroud)