Converting Mat to PIX to setImage

3.9k Views Asked by At

I'm trying to recognize text from a cropped image but I need to pass it from Mat to PIX because X-Platform coding.

I tried this, this and this

And doing the same function passing Mat and PIX with the same image, results are very very different (with PIX it works perfectly, with Mat it gets messed).

What am I probably doing bad?

Thanks.

PD: (This is one of the code snippets that I'm using)

String imgToString(const char* variables, Mat gray) {
    char *outText;

    tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
    if (api->Init(NULL, "eng")) {
        String returnString = "Could not initialize tesseract.\n";
        fprintf(stderr, "Could not initialize tesseract.\n");
        return returnString;
    }
    api->SetVariable("tessedit_char_whitelist", variables);

    // Open input image with leptonica library
    api->TesseractRect(gray.data, 1, gray.channels() * gray.size().width, 0, 0, gray.cols, gray.rows);
    // Get OCR result
    outText = api->GetUTF8Text();
    return outText;
}

// The one below works fantastic

String imgToString(const char* variables, const char* filename) {
    char *outText;

    tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
    if (api->Init(NULL, "eng")) {
        String returnString = "Could not initialize tesseract.\n";
        fprintf(stderr, "Could not initialize tesseract.\n");
        return returnString;
    }
    api->SetVariable("tessedit_char_whitelist", variables);

    // Open input image with leptonica library
    Pix *image = pixRead(filename);
    api->SetImage(image);
    // Get OCR result
    outText = api->GetUTF8Text();
    return outText;
}
1

There are 1 best solutions below

0
On

Problem is seems to be in a gray image. As tesseract's pix.h header says library works on images with 32-bit per pixel depth. Also tesseract weighs colors, so right alignment of them should be done (opencv on default stores colors as BGR, but tesseract wait RGBA). Resume:

#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>    
#include <opencv2/opencv.hpp>
...
char imagename[] = "testimg.jpg";
cv::Mat _mat = cv::imread(imagename);
cv::cvtColor(_mat, _mat, CV_BGR2RGBA); 
api.SetImage(_mat.data, _mat.cols, _mat.rows, 4, 4*_mat.cols);
char *outtext = api.GetUTF8Text();
...