2016-04-07 4 views
1

Ich versuche, Text aus Bild mit OpenCV und Tesseract extrahieren. Ich habe es geschafft, die Textbereiche zu erkennen und Begrenzungsrahmen zu verwenden, um sie zu begrenzen. Aber jetzt kann ich nicht herausfinden, wie man die Begrenzungsboxen an Tesseract weitergibt.Passing Bild mit OpenCV Bounding-Boxen zu Tesseract OCR

 for(int idx = 0; idx >= 0; idx = hierarchy[idx][0]) 
     { 
      Rect rect = boundingRect(contours[idx]); 
      Mat maskROI(mask, rect); 
      maskROI = Scalar(0, 0, 0); 
      // fill the contour 
      drawContours(mask, contours, idx, Scalar(255, 255, 255), CV_FILLED); 
      // ratio of non-zero pixels in the filled region 
      double r = (double)countNonZero(maskROI)/(rect.width*rect.height); 

      if (r > .45 /* assume at least 45% of the area is filled if it contains text */ 
       && 
       (rect.height > 8 && rect.width > 8) /* constraints on region size */ 
       /* these two conditions alone are not very robust. better to use something 
       like the number of significant peaks in a horizontal projection as a third condition */ 
       ) 
      { 
       rectangle(rgb, rect, Scalar(0, 255, 0), 2); 
      } 
     } 
     imwrite(OUTPUT_FOLDER_PATH + string("/rgb.jpg"), rgb); 
    return 0; 
    } 

Ich bekomme sehr gute Ergebnisse mit den Bounding-Boxen. Bild mit Begrenzungsboxen:

enter image description here

Und dann versuchte cv::text::OCRTesseract::run aber das scheint nicht zu funktionieren.

Jeder hat eine Idee?

EDIT: Ich hatte die meisten der Code zu entfernen, weil die Firma i in einem Praktikum bin mit bat mir. Aber das ist für mein Projekt zum Jahresende. Sobald ich das Jahr beendet habe, werde ich den Post mit einem GitHub Link für das ganze Projekt bearbeiten.

+0

Können Sie die beschnittenen Bilder nicht weitergeben? – Miki

+0

In diesem Code ist kein zugeschnittenes Bild enthalten. Es erkennt nur die Textbereiche und dann konturiert sie/ – user3491634

+0

Ja, ich sehe ... Können Sie nicht das Bild auf jedem Rechteck zuschneiden, und jede Ernte zu tesseract übergeben? – Miki

Antwort

2

Zuerst danke an miki für die Hilfe. Dies ist, was ich getan habe, um dieses Problem zu beheben.

  1. Beschneiden Sie das Originalbild für jede Bounding Box. Das gibt mir separate Bilder für die vielen Textbereiche in der image.To dies zu tun, setzen Sie einfach Mat cropedImage = small(Rect(rect)); unter dieser Linie rectangle(rgb, rect, Scalar(0, 255, 0), 2);

  2. eine Instanz OCRTesseract Klasse machen und die Tesseract Motor initialisieren. Um dies zu tun, fügen Sie diese Zeile Ptr<cv::text::OCRTesseract> tess = cv::text::OCRTesseract::create(NULL,NULL,NULL,3,3); (vorzugsweise vor Ihrem Haupt, aber Sie können es überall einfügen, solange es vor der for-Schleife in diesem Code ist). Die Parameter sind NICHT obligatorisch, also können Sie einfach Ptr<cv::text::OCRTesseract> tess = cv::text::OCRTesseract::create(); setzen.

    1. Nun, da Sie Ihren Motor haben. Sie können die OCR ausführen. Sie können es mit vielen Parametern ausführen, aber ich bleibe bei der Basis: dem Eingabebild und dem Ausgabetext. So können Sie nun diese Zeile hinzufügen tess->run(cropedImage, output_string); knapp unter diesem Mat cropedImage = small(Rect(rect));

Bitte beachten Sie, dass es vorzuziehen ist, die beschnittene Bilder, bevor er sie an die OCR (Thresholding zu binäres Bild zu bearbeiten, vergrößern die Ernte so die Text nicht berührt den Rand)

0

Sie müssen die OpenCV zusätzliche Module, bevor Sie cv verwenden können :: Text :: OCRTesseract :: run. Sie können das gleiche von here herunterladen.

Das Tutorial am unteren Rand dieser Seite wird Ihnen sagen, wie man sie auf Linux installieren, mit Ihrem OpenCV zu verwenden. Soweit ich mich erinnern kann, müssen Sie sie während der Installation von OpenCV erstellen. Auch diese Module sind nur für OpenCV3.

Für Fenster Anweisungen, schauen here.

Verwandte Themen