2016-05-07 11 views
1

Edit :: machte einige Code-Änderung und zumindest bekomme ich nicht die leere Seite Fehler. Aktualisiere den Code unten.OCRTesseract in OpenCV3 funktioniert nicht richtig für relativ einfaches Bild

Ich benutze OpenCV3 und Tesseract und habe etwas Bearbeitung auf einem relativ einfachen Bild gemacht und ich habe erwartet, dass der ocr Teil reibungslos funktioniert, aber es ist nicht.

Image: Image to run OCR on

Code:

Ptr<cv::text::OCRTesseract> ocr = 
    cv::text::OCRTesseract::create(NULL /*datapath*/, "eng" /*lang*/, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" /*whitelist*/, 2 /*oem*/, 10 /*psmode*/); 

string output; 
vector<Rect> boxes; 
vector<string> words; 
vector<float> confidences; 
ocr->run(gray3, output, &boxes, &words, &confidences, cv::text::OCR_LEVEL_WORD); 

Ausgang:

I 

Jede Idee, was los ist?

Danke.

+0

Was ist los ist, dass Ihre Eingabe wie ein 'I' aussieht. Was ist deine Frage? –

+0

Das Bild ist eindeutig kein Ich, was kann ich tun, um die Erkennung besser zu machen? – Ahsan

+1

Haben Sie versucht, die mit den Rahmen verbundenen Blobs zu entfernen? Dies könnte helfen, die Ausgabe zu verbessern. Andernfalls sollten Sie Tesseract-ocr für bessere Ergebnisse trainieren. –

Antwort

1

Das Entfernen der Blobs, die mit den Rahmen verbunden sind, wird helfen, Tesseract zu verbessern. So nehmen wir Ihr Bild:

example Sie wollen das Bild invertieren, so das Zeichen ist weiß und Hintergrund schwarz:

Mat img = imread("T2.png"); // reading the example image 
    cvtColor(img, img, CV_RGB2GRAY); 
    bitwise_not(img, img); // invert the image 

Dann wollen wir die Blobs an die Grenzen mit der floodFill Methode

verbunden entfernen
// Remove blobs attached on corners 
    uchar white(255); 
    // do top and bottom row 
    for (int y = 0; y < img.rows; y += img.rows - 1) 
    { 
     uchar* row = img.ptr<uchar>(y); 
     for (int x = 0; x < img.cols; ++x) 
     { 
      if (row[x] == white) 
      { 
       floodFill(img, Point(x, y), Scalar(0), (Rect*)0, Scalar(), Scalar(200)); 
      } 
     } 
    } 
    // fix left and right sides 
    for (int y = 0; y < img.rows; ++y) 
    { 
     uchar* row = img.ptr<uchar>(y); 
     for (int x = 0; x < img.cols; x += img.cols - 1) 
     { 
      if (row[x] == white) 
      { 
       floodFill(img, Point(x, y), Scalar(0), (Rect*)0, Scalar(), Scalar(200)); 
      } 
     } 
    } 

Dies wird folgendes Bild erzeugen:

output image

Laufende tesseract auf diesem Bild wird in 'T' statt 'I' Hoffnung dies hilft Ihnen bei der Lösung Ihres Problems. :)

+0

Während dies funktioniert, denke ich, dass mein Verständnis des Codes schwach ist. zB für (inty = 0; y (y); for (int x = 0; x Ahsan

+0

floflfill sollte nur füllen (schwarz), wenn die Blobs mit den Grenzen verbunden sind. Wie Sie in dem hier gezeigten Beispiel sehen können, bleibt das Zeichen "T" im Bild erhalten. –