我正在尝试识别裁剪图像中的文字,但我需要将其从Mat
传递给PIX
,因为X-Platform编码。
使用同一图像传递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;
}
答案 0 :(得分:1)
问题似乎是灰色图像。正如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();
...