有没有办法使用 NDK(ndk-build)为 Android 编译库 OpenALPR(https://github.com/openalpr/openalpr)?
4 回答
这是为 android 编译库的指南:
为 Android 设备编译 OpenALPR 的教程
[步骤 0]
- 下载并部署android-ndk
- 将 android-ndk 根文件夹的符号链接指向 /opt
[第1步]
- 下载并安装 OpenCV for Android ( http://opencv.org/platforms/android.html ) (只需按照 OpenCV 团队提供的教程进行操作)
[第2步]
- 构建 tess-two 库(https://github.com/rmtheis/tess-two)(与 OpenCV4Android 相同,遵循 GitHub 页面上的构建步骤)
[步骤 3]
下载并安装 Android CMake 项目 ( https://code.google.com/p/android-cmake/ ) 您最终应该得到一个用于生成 android 项目的工具链。如果你必须选择使用哪个编译器,我推荐 gcc4.6,因为我没有使用指向 gcc4.8 编译器的工具链来编译 OpenALPR...
在 /opt 中创建一个指向 android-toolchain 文件夹的符号链接(即:sudo ln -s PATH_TO_ANDROID_TOOLCHAIN /opt/android-toolchain)。(android-toolchain文件夹是在Android CMake项目部署过程中生成的!)
[第4步]
- 从 github ( https://github.com/openalpr/openalpr )下载 openalpr-master
- 在 openalpr-master 目录中创建一个文件夹“build”
转到 src 目录并编辑 CMakeLists.txt 文件:
- 替换这一行: SET(OpenCV_DIR "${CMAKE_SOURCE_DIR}/../libraries/opencv/")
- 与:SET(OpenCV_DIR“path_to_OpenCV4Android/sdk/native/jni”)
然后评论生成 alprd 的部分(或删除它):
在基于 Unix 的操作系统上编译 alprd 库
IF(非 WIN32)ADD_EXECUTABLE(alprd daemon.cpp videobuffer.cpp daemon/beanstalk.c daemon/beanstalk.cc daemon/uuid.cpp)
TARGET_LINK_LIBRARIES(alprd openalpr 支持 uuid curl log4cplus ${OpenCV_LIBS} ${Tesseract_LIBS} ) ENDIF()
打开 CMake
- 将源代码指向 openalpr-master/src 目录
- 将构建路径指向 openalpr-master/build 目录
- 按“配置”按钮
- 选择“Unix Makefiles”(默认)并选择“Specify toolchain for cross-compile”然后点击“Next”
- 指定要使用的工具链文件:如果你实现了第 3 步,它应该位于 $ANDROID_CMAKE/toolchain/android.toolchain.cmake 下(确保将 $ANDROID_CMAKE 替换为其对应的绝对路径)
- 点击完成
应该没有任何错误,但有一些警告......没关系
- 按生成
[步骤 5]
- 转到构建目录并编辑此文件: misc_utilities/CMakeFiles/benchmark.dir/link.txt :删除 -lpthread 选项(应该只有这样的一行)。保存并退出。
- 打开文件资源管理器并转到 path_to_tess-two/tess-two/jni/com_googlecode_tesseract_android/src
- 现在搜索每个头文件(按搜索按钮并输入“.h”)
- 将每个头文件复制并粘贴到 openalpr-master/src/openalpr/tesseract (你应该先创建这个目录)
- 在 openalpr-master 的根路径中创建这些目录“libraries/tesseract-ocr/api/.libs”(mkdir -p libraries/tesseract-ocr/api/.libs)
- 将 path_to_tess-two/tess-two/libs/armeabi-v7a/libtess.so 复制并粘贴到 openalpr-master/libraries/tesseract-ocr/api/.libs/libtesseract.so (确保将其从 libtess.so 重命名为libtesseract.so !)
- 打开终端并转到构建文件夹(openalpr-master/build)
- 做吧”
一切都应该顺利编译。您可以在 openalpr-master/src/libs/armeabi-v7a 中找到 alpr 库
就是这样,让我知道你的成功和失败,我会尽力帮助你
如果您仍在寻求实现它,以下是我在 Android 设备上使用 OpenAlpr 所遵循的步骤:
- 首先下载并安装适用于 Android 的 OpenCV ( http://opencv.org/platforms/android.html )
- 构建 tess-two 库 ( https://github.com/rmtheis/tess-two )
- 下载并安装 Android CMake 项目 ( https://code.google.com/p/android-cmake/ )
- 然后使用 CMake 你应该能够编译 OpenAlpr 库(在这个过程中发生了很多技巧,注册到 tesseract 库、opencv 等的路径......)
我在 Windows 8.1 和 Ubuntu 13.10/14.04 上尝试过,两者都运行良好
这些是构建库的主要步骤,您还需要编写一个 Android.mk 文件来使用该库。
如果你有兴趣(或其他人)让我知道,我会写一个正确的分步教程
是的,这应该是可能的。您需要先获取 Android 版本的 OpenCV 和 Tesseract 设置。但是一旦完成,OpenALPR 应该可以在 Android 下干净地编译。
不过,我怀疑在手机上的性能不会很好。车牌识别是一个计算密集型的过程。
这是我使用的 Android.mk 内容:
LOCAL_PATH := $(call my-dir)
LIB_PATH := $(LOCAL_PATH)/../libs/armeabi-v7a
include $(CLEAR_VARS)
LOCAL_MODULE := leptonica
LOCAL_SRC_FILES := liblept.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := tesseract
LOCAL_SRC_FILES := libtess.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := simpleini
LOCAL_SRC_FILES := libsimpleini.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := support
LOCAL_SRC_FILES := libsupport.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := openalpr
LOCAL_SRC_FILES := libopenalpr-static.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
OPENCV_INSTALL_MODULES:=on
OPENCV_CAMERA_MODULES:=off
include path_to_opencv4android/OpenCV.mk
LOCAL_MODULE := nativealpr
LOCAL_SRC_FILES := NativeAlpr.cpp
LOCAL_SHARED_LIBRARIES += tesseract leptonica
LOCAL_STATIC_LIBRARIES += openalpr support simpleini
include $(BUILD_SHARED_LIBRARY)
这是Application.mk
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
在 Android.mk 文件中,NativeAlpr.cpp 文件包含使用 OpenALPR 库所需的本机代码