Estoy tratando de reconocer el texto de una imagen recortada pero necesito pasarlo de Mat
a PIX
porque la encoding de X-Platform.
Intenté esto , esto y esto
Y al hacer la misma función pasando Mat
y PIX
con la misma imagen, los resultados son muy diferentes (con PIX
funciona perfectamente, con Mat
se ensucia).
¿Qué estoy haciendo mal probablemente?
Gracias.
PD: (Este es uno de los fragmentos de código que estoy usando)
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; }
El problema es que parece estar en una imagen gris. Como dice el encabezado pix.h de tesseract, la biblioteca funciona en imágenes con 32 bits por píxel de profundidad. También tesseract pesa los colores, por lo que se debe realizar la alineación correcta de los mismos (opencv en los colores predeterminados almacena los colores como BGR, pero tesseract espera RGBA). Currículum:
#include #include #include ... 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(); ...