2009-01-23 7 views
3

Je dois appeler tesseract OCR (c'est une bibliothèque open source en C++ qui fait la reconnaissance optique de caractères) à partir d'un serveur d'applications Java. En ce moment, il est assez facile d'exécuter l'exécutable en utilisant Runtime.exec(). La logique de base seraitAppel via la ligne de commande par rapport à JNI

  1. Enregistrer l'image qui est actuellement détenu dans la mémoire de fichier (.tif)
  2. passe au nom du fichier image au programme de ligne de commande Tesseract.
  3. lire dans le fichier texte de sortie à partir de Java en utilisant FileReader.

Quelle amélioration en termes de performances est susceptible d'obtenir en écrivant une enveloppe JNI pour Tesseract? Malheureusement, il n'y a pas de wrapper JNI open source qui fonctionne sous Linux. Je devrais le faire moi-même et je me demande si l'avantage vaut le coût de développement.

+1

Pouvez-vous s'il vous plaît coller la commande que vous avez utilisée dans Runtime.exec() pour exécuter la commande tesseract. Je ne peux pas le sortir ... – jorgen

Répondre

4

Il est difficile de dire si cela en vaudrait la peine. Si vous supposez que si le code OCR est en cours de traitement via JNI, il peut accéder directement aux données d'image sans avoir à les écrire dans un fichier, ce qui éliminerait certainement les contraintes d'E/S du disque.

Je recommanderais d'adopter l'approche la plus simple et de ne prendre en charge l'option JNI que si les performances ne sont pas acceptables. Au moins, vous serez en mesure de faire un peu d'analyse comparative et d'estimer les gains de performance que vous pourriez réaliser.

1

Je suis d'accord avec tweakt. N'utilisez pas JNI s'il n'y a pas de raisons de performance pour cela. La stabilité de votre application peut également être compromise si vous utilisez des appels JNI s'il y a des risques de fuites de mémoire ou même des plantages dans votre couche JNI ou dans la ROC elle-même. Cela n'arrivera jamais si vous l'utilisez via l'interface de ligne de commande (toute la mémoire sera libérée à la sortie du programme et toutes les terminaisons anormales du programme peuvent être vérifiées dans le code de l'appelant).

4

Si vous poursuivez votre propre emballage, nous vous recommandons de consulter le JNA. Il vous permettra d'appeler la plupart des bibliothèques "natives" en écrivant uniquement du code Java, et vous donnera plus d'aide que le JNI brut pour le faire en toute sécurité. JNA est disponible pour la plupart des plates-formes.

+0

Merci pour le conseil que je n'avais pas entendu parler de la JNA. Je regarderai dedans pour tous futurs projets qui exigent la liaison native. – Ish

+0

Deux autres bibliothèques de mapping (JInvoke et Swig) sont mentionnées ici: http://stackoverflow.com/questions/1172486/is-there-a-market-for-jni –

+1

JNA ne joue pas bien avec C++ mais plutôt avec C, et Tesserect a migré (en grande partie) vers C++. –

Questions connexes