2013-08-12 8 views
5

Ich habe ein C++ - Projekt in Visual Studio 2010 und möchte OCR verwenden. Ich stieß auf viele "Tutorials" für Tesseract, aber leider hatte ich nur Kopfschmerzen und verschwendete Zeit. In meinem Projekt habe ich ein Bild gespeichert als Mat. Eine Lösung für mein Problem ist, diese Matte als Bild (image.jpg zum Beispiel) zu speichern und dann rufen Tesseract ausführbare Datei wie folgt aus:Wie Tesseract zu dem Ausführen mit Projekt in Visual Studio 2010 implementiert wird

system("tesseract.exe image.jpg out"); 

Welche wird mir eine Ausgabe out.txt und dann rufe ich

infile.open ("out.txt"); 

, um die Ausgabe von Tesseract zu lesen.

Es ist alles gut und funktioniert wie ein Stuhl, aber es ist keine optimale Lösung. In meinem Projekt verarbeite ich ein Video so speichern/Anruf .exe/schreiben/lesen bei 10 + FPS ist nicht das, was ich wirklich suche. Ich möchte Tesseract in bestehenden Code implementieren, um eine Mat als Argument übergeben zu können und sofort ein Ergebnis als String zu erhalten.

Kennen Sie ein gutes Tutorial (z. B. Schritt-für-Schritt), um Tesseract OCR mit Visual Studio 2010 zu implementieren? Oder deine eigene Lösung?

Antwort

16

OK, ich es herausgefunden, aber es funktioniert für Veröffentlichung und Win32 nur Konfiguration (keine Debug oder x64). Es gibt viele Verbindungsfehler unter Debug-Konfiguration.

So

1. Zu allererst Download bereit Bibliotheksordner (Tesseract + Leptonica) hier:

Mirror 1(Google Drive)

Mirror 2(MediaFire)


2. Extract tesseract.zip zu C:\


in Visual Studio gehen unter C/C++ > General > Additional Include Directories

Insert C:\tesseract\include


4. Unter Linker > General > Additional Library Directories

Insert C:\tesseract\lib


5. unter 012.

Anzahl:

liblept168.lib 
libtesseract302.lib 

Beispielcode sollte wie folgt aussehen:

#include <tesseract\baseapi.h> 
#include <leptonica\allheaders.h> 
#include <iostream> 

using namespace std; 

int main(void){ 

    tesseract::TessBaseAPI api; 
    api.Init("", "eng", tesseract::OEM_DEFAULT); 
    api.SetPageSegMode(static_cast<tesseract::PageSegMode>(7)); 
    api.SetOutputName("out"); 

    cout<<"File name:"; 
    char image[256]; 
    cin>>image; 
    PIX *pixs = pixRead(image); 

    STRING text_out; 
    api.ProcessPages(image, NULL, 0, &text_out); 

    cout<<text_out.string(); 

    system("pause"); 
} 

Für die Interaktion mit OpenCV und Mat Typ Bilder sehen HERE

+0

Ich sagte Sprachdatenpfad so, dass es funktionierte. api.Init ("C: \\ tessdata", "eng", tesseract :: OEM_DEFAULT); –

+0

Ich kann Ordner finden, die "Tessdata" ??Sollte ich es erstellen oder muss es in Ordner @ İsmailKocacan –

+0

Ich lade Ordner Ihren Link, aber es hat keine Daten? @OpenMinded –

0

Sie müssen die Bibliothek über die API verwenden.

Wahrscheinlich:

+0

die Libs heruntergeladen. In _C/C++> Allgemein> Zusätzliche Include-Verzeichnisse: _ Hinzugefügt _ \ include_-Ordner. In _Linker> Allgemein> Zusätzliche Bibliotheksverzeichnisse: _ Ordner _ \ lib_ hinzugefügt. In _Linker> Eingabe> Zusätzliche Abhängigkeiten: _ Hinzugefügt _libtesseract302.lib_ und _libtesseract302d.lib_. Hat ein einfaches Programm geschrieben und kann aufgrund von Verknüpfungsfehlern für jede aufgerufene Methode kein Objekt erstellen. Zum Beispiel: Fehler Fehler LNK2019: nicht aufgelöstes externes Symbol "public: Zeichen * __cdecl tesseract :: TessBaseAPI :: GetUTF8Text (void)" (? GetUTF8Text @ TessBaseAPI @ tesseract @@ QEAAPEADXZ) verwiesen in Funktion main'. Was vermisse ich? – OpenMinded

+0

Gute Nachrichten: Kompilierungsschritt funktioniert. Schlechte Nachrichten, der Verbindungsschritt schlägt fehl. Es sieht so aus, als würde es nicht die richtige Bibliothek zum Verknüpfen finden. Ich würde empfehlen, libtesseract302.lib in release und libtesseract302d.lib in debug zu verwenden. Sie können in Ihrem visuellen Projekt zur ConfigurationProperts/Linked/Befehlszeile gehen, um sicherzustellen, dass die Befehlszeile auf den richtigen Speicherort zeigt. – Bruce

+0

Ich habe die x64-Konfiguration wegen OpenCV verwendet ... also bin ich zu x86 gewechselt. Keine Tesseract-Verknüpfungsfehler mehr. Jetzt habe ich ähnliche Verknüpfungsfehler aber mit OpenCV-Funktionen. Also habe ich OpenCV weggeworfen und versucht Tesseract zu bauen, nur um zu sehen, ob es funktioniert. Switched imread (OpenCV) für pixRead (Leptonica?). Anscheinend erkennt es diese Funktion pixRead nicht. Ich denke, ich brauche Leptonica-Header? allheaders.h oder was? Ich gebe langsam auf alles auf: -/ – OpenMinded

2

Es ist viel seit der letzten Antwort, aber es kann anderen helfen;

  1. Ich glaube, Sie müssen auch an das Ziel Ihrer exe "liblept168.lib" und "liblept168d.lib" auf zusätzliche Abhängigkeiten
  2. Add "liblept168.dll" und "liblept168d.dll" hinzufügen.
  3. Fügen Sie Ihrem Code #include hinzu.

(Diese Antwort muss ein Kommentar zu Bruce Antwort. Sorry für Verwirrung.)

+0

Wenn Sie sagen "add #include zu Ihrem Code", was genau muss enthalten sein? – MPorto

+0

sollten Sie hinzufügen: #include #include pourjour