Adición de Tesseract y Opencv a Android.mk (Android Studio)

Seguí las instrucciones de aquí y agregué OpenCV con éxito. Pero he estado tratando de añadir tesseract a la Android.mk, así, durante unos días, y no han sido capaces de hacerlo.

Tengo un android.cpp que utiliza tesseract así que tengo que incluir la dependencia en mi Android.mk. Encontré este post que tenía casi el problema exacto y lo resolvió importando archivos libtess.so y liblept.so en Android.mk, pero no explicó cómo hacerlo, así que busqué y encontré este post que muestra cómo vincular Bibliotecas pre-construidas. Así que basándome en que he probado este Android.mk:

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := liblept LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/liblept.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../tess-two/jni include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libtess LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/libtess.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../tess-two/jni include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) OPENCV_PACKAGE_DIR:= /Users/danielsierraf/Documents/OpenCV-2.4.10-android-sdk/sdk OPENCV_CAMERA_MODULES := off include $(OPENCV_PACKAGE_DIR)/native/jni/OpenCV.mk LOCAL_MODULE := run_detection LOCAL_SHARED_LIBRARIES := libtess LOCAL_SRC_FILES := text_detect.cpp android.cpp LOCAL_LDLIBS += -landroid -llog -ldl include $(BUILD_SHARED_LIBRARY) 

Y obtuvo esta salida:

 [armeabi-v7a] Prebuilt : liblept.so <= src/main/jni/../libs/armeabi-v7a/ [armeabi-v7a] Install : liblept.so => src/main/jniLibs/armeabi-v7a/liblept.so [armeabi-v7a] Compile++ thumb: run_detection <= text_detect.cpp In file included from src/main/jni/text_detect.h:4:0, from src/main/jni/text_detect.cpp:10: src/main/jni/../../../../tess-two/jni/com_googlecode_tesseract_android/src/api/baseapi.h:32:22: fatal error: platform.h: No such file or directory #include "platform.h" ^ compilation terminated. 

Así que supongo que no está enlazando correctamente libtess, y si lo mira de cerca, no instala nunca libtess.so, parece que instala liblept.so , y luego salta a text_detect.cpp , ignorando esta parte:

 include $(CLEAR_VARS) LOCAL_MODULE := libtess LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/libtess.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../tess-two/jni include $(PREBUILT_SHARED_LIBRARY) 

Así que traté de obligar a instalar liblept y libtess completamente antes de proceder por ponerlo en diferentes archivos. Así que puse la última parte del archivo en un Android.mk diferente en otra carpeta y trató de incluir $ (llamada all-subdir-makefiles) , y luego instala libtess y liblept completamente, pero ignora la llamada all-subdir-makefiles .

Nueva estructura de carpetas jni:

 Android.mk Application.mk text_detect/ Android.mk android.cpp text_detect.cpp text_detect.h 

Android.mk

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := liblept LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/liblept.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../tess-two/jni include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libtess LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/libtess.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../tess-two/jni include $(PREBUILT_SHARED_LIBRARY) include $(call all-subdir-makefiles) 

Textdetect / Android.mk

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) OPENCV_PACKAGE_DIR:= /Users/danielsierraf/Documents/OpenCV-2.4.10-android-sdk/sdk OPENCV_CAMERA_MODULES := off include $(OPENCV_PACKAGE_DIR)/native/jni/OpenCV.mk LOCAL_MODULE := run_detection LOCAL_SHARED_LIBRARIES := libtess LOCAL_SRC_FILES := text_detect.cpp android.cpp LOCAL_LDLIBS += -landroid -llog -ldl include $(BUILD_SHARED_LIBRARY) 

Y esta es la salida:

 [armeabi-v7a] Prebuilt : liblept.so <= src/main/jni/../libs/armeabi-v7a/ [armeabi-v7a] Install : liblept.so => src/main/jniLibs/armeabi-v7a/liblept.so [armeabi-v7a] Prebuilt : libtess.so <= src/main/jni/../libs/armeabi-v7a/ [armeabi-v7a] Install : libtess.so => src/main/jniLibs/armeabi-v7a/libtess.so [armeabi] Prebuilt : liblept.so <= src/main/jni/../libs/armeabi/ [armeabi] Install : liblept.so => src/main/jniLibs/armeabi/liblept.so [armeabi] Prebuilt : libtess.so <= src/main/jni/../libs/armeabi/ [armeabi] Install : libtess.so => src/main/jniLibs/armeabi/libtess.so [mips] Prebuilt : liblept.so <= src/main/jni/../libs/mips/ [mips] Install : liblept.so => src/main/jniLibs/mips/liblept.so [mips] Prebuilt : libtess.so <= src/main/jni/../libs/mips/ [mips] Install : libtess.so => src/main/jniLibs/mips/libtess.so [x86] Prebuilt : liblept.so <= src/main/jni/../libs/x86/ [x86] Install : liblept.so => src/main/jniLibs/x86/liblept.so [x86] Prebuilt : libtess.so <= src/main/jni/../libs/x86/ [x86] Install : libtess.so => src/main/jniLibs/x86/libtess.so 

Como ves, instala todo desde el primer Android.mk perfectamente, pero nunca ejecuta textdetect / Android.mk

Entonces, ¿qué estoy haciendo mal? ¿Cómo puedo lograr esta tarea que parece tan simple? hay una manera mas facil?

EDITAR:

Después de la respuesta @ ph0b regresé a mi primera configuración y LOCAL_EXPORT_C_INCLUDES los mismos LOCAL_EXPORT_C_INCLUDES como los Makefiles originales (con un par de variaciones adaptándolo a mis caminos), y eso lo solucionó. No pudo encontrar platform.h porque no sabía dónde buscarlo.

Ahora, después de hacer este cambio tuve un error diferente No such file or directory #include "com_googlecode_tesseract_android/src/api/baseapi.h" y pensé que esto era porque no compilar tesseract antes de run_detection que depende de él. Bueno, ese no era el problema, todavía compila run_detection antes de tesseract pero que no era el problema, era mucho más simple y me siento tan estúpido por haber pasado tanto tiempo en este error. El problema fue que no encontré com_googlecode_tesseract_android/src/api/baseapi.h porque no proporcioné la ruta para eso, así que copié com_googlecode_tesseract_android y com_googlecode_leptonica_android de com_googlecode_leptonica_android -two y agregó $(LOCAL_PATH) a LOCAL_EXPORT_C_INCLUDES . Esta es mi solución final:

Jni estructura de carpetas:

 Android.mk Application.mk text_detect.cpp android.cpp text_detect.h com_googlecode_leptonica_android com_googlecode_tesseract_android 

Android.mk

 LOCAL_PATH := $(call my-dir) #leptonica LEPTONICA_LOCAL := $(LOCAL_PATH)/com_googlecode_leptonica_android LEPTONICA_PATH := $(LEPTONICA_LOCAL)/src include $(CLEAR_VARS) LOCAL_MODULE := liblept LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/liblept.so LOCAL_EXPORT_C_INCLUDES := \ $(LEPTONICA_LOCAL) \ $(LEPTONICA_PATH)/src include $(PREBUILT_SHARED_LIBRARY) #tesseract TESSERACT_LOCAL := $(LOCAL_PATH)/com_googlecode_tesseract_android TESSERACT_PATH := $(TESSERACT_LOCAL)/src include $(CLEAR_VARS) LOCAL_MODULE := libtess LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/libtess.so LOCAL_EXPORT_C_INCLUDES := \ $(LOCAL_PATH) \ $(TESSERACT_PATH)/api \ $(TESSERACT_PATH)/ccmain \ $(TESSERACT_PATH)/ccstruct \ $(TESSERACT_PATH)/ccutil \ $(TESSERACT_PATH)/classify \ $(TESSERACT_PATH)/cube \ $(TESSERACT_PATH)/cutil \ $(TESSERACT_PATH)/dict \ $(TESSERACT_PATH)/opencl \ $(TESSERACT_PATH)/neural_networks/runtime \ $(TESSERACT_PATH)/textord \ $(TESSERACT_PATH)/viewer \ $(TESSERACT_PATH)/wordrec \ $(LEPTONICA_PATH)/src \ $(TESSERACT_LOCAL) LOCAL_SHARED_LIBRARIES := liblept include $(PREBUILT_SHARED_LIBRARY) #opencv include $(CLEAR_VARS) OPENCV_PACKAGE_DIR:= /Users/danielsierraf/Documents/OpenCV-2.4.10-android-sdk/sdk OPENCV_CAMERA_MODULES := off include $(OPENCV_PACKAGE_DIR)/native/jni/OpenCV.mk LOCAL_MODULE := run_detection LOCAL_SRC_FILES := text_detect.cpp android.cpp LOCAL_LDLIBS += -landroid -llog -ldl LOCAL_SHARED_LIBRARIES += libtess liblept include $(BUILD_SHARED_LIBRARY) 

Su última configuración está fallando de una manera extraña, ndk-build debería por lo menos intentar compilar su módulo. Tal vez haya un error en all-subdir-makefiles cuando hay módulos ndk definidos antes, y no encuentra Android.mk en tu módulo. Puede intentar tener sólo include $(call all-subdir-makefiles) dentro de su nivel superior Android.mk.

De todos modos, creo que deberías volver a tu primera configuración, con tu módulo directamente en la carpeta raíz jni. Entonces, su problema principal es la declaración adecuada de caminos de inclusión. Tess-two / jni no contiene ningún encabezado? Están en tess-two/jni/com_googlecode_*_android/src/* . Esto significa que debe listarlas en las declaraciones de su módulo, dando todas las rutas absolutas a variables LOCAL_EXPORT_C_INCLUDES (como de los Makefiles originales: https://github.com/rmtheis/tess-two/blob/master/tess-two/ Jni / com_googlecode_tesseract_android / Android.mk # L33 )

También es necesario agregar la dependencia de liblept para libtess: LOCAL_SHARED_LIBRARIES := liblept dentro de libtess library declaration.

Si todavía falla, también hay otra posibilidad: en lugar de redefinir los módulos libtess y liblept usando los archivos .so generados, puede incluir directamente tess-two/jni/Android.mk y usar la misma Application.mk que tess-two ( Copiar `tess-two / jni / Application.mk). Ya definirá correctamente los módulos libtess y liblept.

  • Android OCR: Error de código fuente de AndrOCR
  • Aplicación OCR para Android: diccionario Tesseract
  • Buscando ANPR / LPR (Reconocimiento Automático de Placas de Matrícula / Reconocimiento de Matrículas) SDK para android
  • Cómo reducir el tamaño de la aplicación Android?
  • Android: ¿Cómo mejorar los números dentro de la imagen recuperada por tesseract ocr?
  • Tesseract OCR Android tessdata directorio no encontrado
  • Obtención de error: "mala lectura de inttemp!" Al entrenar una nueva fuente en Tesseract 2
  • Leptonica para mejorar tesseract ocr en android
  • reconocimiento de escritura a mano para el árabe aislado
  • Creación de una actividad de cámara optimizada / adecuada para OCR
  • Incluyendo Tess4J a un proyecto Java como biblioteca en Eclipse
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.