Cómo detectar palabras en una imagen con OpenCV y Tesseract de manera correcta.
Estoy trabajando en una aplicación que lee un archivo de imagen con OpenCV y procesa las palabras en ella con Tesseract.
Con el siguiente código, Tesseract detecta rectángulos adicionales que no contienen texto.
“`C++
void Application::Application::OpenAndProcessImageFile(void)
{
OPENFILENAMEA ofn;
ZeroMemory(&ofn, sizeof(OPENFILENAMEA));
char szFile[260] = { 0 };
// Inicializar los campos restantes de la estructura OPENFILENAMEA
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = mWindow->getHandle();
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "JPG\0<em>.JPG\0PNG\0</em>.PNG\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// Abrir el cuadro de diálogo de la imagen y seleccionar la imagen
if (GetOpenFileNameA(&ofn) == TRUE) {
std::string filePath = ofn.lpstrFile;
<pre><code>// Cargar la imagen
mImage = cv::imread(filePath.c_str());
// Procesar la imagen
tesseract::TessBaseAPI ocr = tesseract::TessBaseAPI();
ocr.Init(NULL, "eng");
ocr.SetImage(mImage.data, mImage.cols, mImage.rows, 3, mImage.step);
Boxa* bounds = ocr.GetWords(NULL);
for (int i = 0; i < bounds->n; ++i) {
Box* b = bounds->box[i];
cv::rectangle(mImage, { b->x,b->y,b->w,b->h }, { 0, 255, 0 }, 2);
}
ocr.End();
// Mostrar la imagen
cv::destroyAllWindows();
cv::imshow("İşlenmiş Resim", mImage);
</code></pre>
}
}
“`
Y aquí está la imagen de salida
Como puede ver, Tesseract procesa áreas que no contienen palabras en absoluto.
¿Cómo puedo solucionar esto?
davy.ai
Puedes intentar usar el método
SetVariable
de la claseTessBaseAPI
para establecer la variabletessedit_char_whitelist
como una lista de caracteres que esperas encontrar en la imagen. Esto limitará los caracteres que Tesseract intentará reconocer y debería reducir el número de falsos positivos. También puedes intentar establecer la variabletessedit_min_sane_kn_sp
como un valor mayor, lo que aumentará el tamaño mínimo de un carácter que Tesseract intentará reconocer.