使用 NDK 为 Android 编译 OpenALPR

Posted

技术标签:

【中文标题】使用 NDK 为 Android 编译 OpenALPR【英文标题】:Compile OpenALPR for Android with NDK 【发布时间】:2014-02-14 02:02:07 【问题描述】:

有没有办法使用 NDK (ndk-build) 为 android 编译 OpenALPR (https://github.com/openalpr/openalpr) 库?

【问题讨论】:

此处更新说明:github.com/openalpr/openalpr/wiki/Android-compilation 【参考方案1】:

这是为 android 编译库的指南:

为 Android 设备编译 OpenALPR 的教程

[步骤 0]

下载并部署android-ndk 创建指向 /opt 的 android-ndk 根文件夹的符号链接

[步骤 1]

下载并安装适用于 Android 的 OpenCV (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 库

如果(不是 WIN32) ADD_EXECUTABLE(alprd daemon.cpp videobuffer.cpp daemon/beanstalk.c daemon/beanstalk.cc daemon/uuid.cpp)

TARGET_LINK_LIBRARIES(alprd openalpr 支持 uuid 卷曲 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 的根路径(mkdir -p libraries/tesseract-ocr/api/.libs)中创建这些目录“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 库

就是这样,让我知道你的成功和失败,我会尽力帮助你

【讨论】:

好吧,我没有阅读 OpenALPR 的先决条件,您可能不必评论或删除 CMakeLists.txt 中关于 alprd 的部分... 我遇到了这个错误:[93%] Building CXX object CMakeFiles/alprd.dir/daemon.cpp.o /Users/ac-1/Dev/openalpr/src/daemon.cpp: 6:30:致命错误:log4cplus/logger.h:没有这样的文件或目录...有什么想法可以找到这个头文件吗? @Phileo99 我通过手动安装 log4cplus (sourceforge.net/p/log4cplus/wiki/Home) 解决了这个问题【参考方案2】:

如果您仍然想实现它,以下是我在 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 文件来使用该库。

如果你有兴趣(或其他人)让我知道,我会写一个正确的分步教程

【讨论】:

嗨,我对一步一步的教程很感兴趣 =) @user1481792 查看我对本教程的新答案;)【参考方案3】:

是的,应该可以。您需要首先获得 Android 版本的 OpenCV 和 Tesseract 设置。但是一旦完成,OpenALPR 应该可以在 Android 下干净地编译。

不过,我怀疑在手机上的性能不会很好。车牌识别是一个计算密集型过程。

【讨论】:

你能给我一个教程或指南来为这个库创建一个正确的 Android.mk 文件吗?【参考方案4】:

这是我使用的 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 库所需的本机代码

【讨论】:

以上是关于使用 NDK 为 Android 编译 OpenALPR的主要内容,如果未能解决你的问题,请参考以下文章

将 Android Studio 配置为使用 NDK(android-ndk-r10d,Windows 64 位)

android开发,怎么使用ndk编译成.so文件

Android NDK: 如何编译JNI为指定的指令集(armeabi/arm64)

如何在Android设备中用NDK编译SQLite并且对SQLite进行操作

使用Android Studio自带的NDK编译JNI

如何使用android的ndk编译器 编译c++的库