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:
- Diccionario personalizado para Tesseract
- Mejor ejemplo de OCR (reconocimiento óptico de caracteres) en android
- ¿Cómo utilizar OpenCV + Tesseract para el reconocimiento de texto exacto en Android?
- Problemas para reconocer dígitos en Tesseract - android
- Números digitales en Tesseract OCR
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)
- Tesseract de OCR para Android: uso de datos de objetos Pixa para mostrar cuadros delimitadores
- Aplicación de OCR para Android que utiliza Tesseract
- ¿Cómo entrenar a tesseract para reconocer números de 20 a 30 dígitos solamente?
- Uso de Tesseract para el reconocimiento de escritura a mano
- Android OCR utilizando tess-dos un tenedor de tesseract
- Error android ndk-build
- Android NDK - construcción de TessTwo (Fork de Tesseract Tools para Android) - ndk-build falla
- Convertir todos los colores distintos de un color en particular en un mapa de bits a blanco
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.
- ¿Cómo integrar Amazon Cognito con Google Plus para Android?
- Android Studio excepción en el plugin Login de Google "" userEmail "de com / google / gct / login / CredentialedUserRoster.setActiveUser no debe ser nulo"