其他分享
首页 > 其他分享> > c-将Mat转换为PIX到setImage

c-将Mat转换为PIX到setImage

作者:互联网

我正在尝试从裁剪的图像中识别文本,但是我需要将其从Mat传递到PIX,因为X平台编码.

我尝试了thisthisthis

并且通过传递具有相同图像的Mat和PIX来执行相同的功能,结果是非常不同的(使用PIX可以完美地工作,而使用Mat则很混乱).

我可能做得不好?

谢谢.

PD:(这是我正在使用的代码片段之一)

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;
}

解决方法:

问题似乎是在灰色图像中.正如tesseract的pix.h标头所说,库适用于每像素深度32位的图像. tesseract还会权衡颜色,因此应该正确对齐颜色(默认情况下,opencv将颜色存储为BGR,但tesseract等待RGBA).恢复:

#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();
...

标签:leptonica,c,opencv,tesseract
来源: https://codeday.me/bug/20191014/1912483.html