OpenCV 整套代码是基于 C 和 C++实现的,在 Android 上调用存在两种方式:
- Java Native 代码实现
- C++ NDK 代码实现
** 其中 Java Native 代码实现是直接通过 Java OpenCV API 编写算法实现部分,相对应的特点在于:**
- 环境搭建简单:直接引入官方
OpenCV-for-Android
的对应 jar 包即可 - 代码维护繁琐:由于
OpenCV-for-Android
的Java API
与C++
不完全相同,任何算法的更新都需要重写 => 在存在 Windows、iOS 等多平台更新时比较麻烦 - 运行效率低:Java 代码会在内部进行 C++翻译,运行时性能损耗较大
** 而直接采用 C++代码导入的方式的特点在于:**
- 环境搭建复杂:往往需要现自行编译对应的库,再进行
NDK、Cmakelists
和build.gradle
的配置. - 代码维护简单:由于直接采用 C++实现算法部分,与其他平台的兼容性极好,能与 Android 程序员分离开发 => 算法升级时替换对应的算法库文件即可.
- 运行效率高:不存在内部执行时的代码转换问题,性能最好.
- 总结来看,Java Native 代码实现是爽一时但是后面会不爽很久,对于有时间精力且要求较高的开发任务,强烈建议多花点时间搭建 C++ NDK 方式.
如果自己不从源码编译也可去这里下载,网上很多配置教程都是基于这里下载的 SDK 而写的.如: Android Studio 集成 OpenCV
Python 脚本编译
- 依赖工具
- CMake > 3.7
- ninja-build
- ccache
- python
安装编译工具
1 | ~$ apt-get install ninja-build ccache |
- 使用opencv-3.4.1/platforms/android/build_sdk.py 脚本安装,可以一次编译多种平台的 SDK,相关的一些配置要参照文件ndk-16.config.py.
- 如果没有出错误的话,build-ndk目录结构如下:
1 | ~$ tree build-ndk -L 1 |
CMake 编译方式
编译环境
这里可能要注意, 本次编译测试必須使用**[tools_r25.2.5]**
建议使用**[tools_r25.2.5]**测试编译,不然有可能会出现如下错误
1 | -- SDK target: android_sdk_target-NOTFOUND |
CMake 单独编译参数
1 | ~$ cd /fullpath/Android/Sdk |
- 运行完成make install后,所有相关的库文件都会安装到**/fullpath/opencv3-android-ndk**,目录如下:
1 | opencv3-android-ndk$ tree -L 3 |
Android Studio 集成 OpenCV 测试
- 这里可以直接导入一个 OpenCV Samples 工程做测试,我编译安装完上述 SDK 后,使用了
samples/tutorial-1-camerapreview
这个工程做测试,正常情况下,app 会通过 opencv 打开摄像头.
原有工程,添加 OpenCV 支持
- 创建一个支持 C++的 Android 工程
- 导入模块, File->New->Import Module ,选择**/fullpath/opencv3-android-ndk** ,这里我把它命名为**:opencv_sdk**, Finish.
- 如果 IDE 没有报错,
- 进入 File>Project Structure. 选择app ,点击Dependencides,点击
+
->3 Module dependency
->模块名
, - 等几分钟,IDE 就会处理完导入库的操作.
- 如果在File>Project Structure没有看到一个新的模块名
opencv_sdk
,但是它的目录已经复制到工程目录的根目录下了,就在settings.gradle里的include
后面加上如: include ‘:app’,’opencv_sdk’ - 因为我本次使用的是Android-Studio 3.1的版本,要把build.gradle里的修改成 26以上,不然会出错:
1 | android { |
- 导入模块后,IDE 会把 opencv 相关复制工程根目录下,目录名为opencv_sdk.导入后 Android 工程目录如下:
1 | ~$ tree -L 1 |
纯 JNI C++
开发,调用 OPENCV
- 如果我们要在 Android 工程里的使用 JNI 直接调用 opencv 的 API 函数,如上面工程 src/main/cpp/native-lib.cpp.
需要在app/build.gradle 的android
结点里添加相关路径:
1 |
|
app/CMakeLists.txt
里要包含如下信息:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
set(pathToOpenCV ${CMAKE_CURRENT_SOURCE_DIR}/../open_sdk )
include_directories(${pathToOpenCV}/native/jni/include) # Not needed for CMake >= 2.8.11
set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
add_library( lib_opencv STATIC IMPORTED )
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION
${pathToOpenCV}/native/libs/${ANDROID_ABI}/libopencv_java3.so)
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib}
lib_opencv # 要加上这lib_opencv 才能链接到opencv的库.
)添加上述路径之后,就可以在src/main/cpp/native-lib.cpp 里添加
#include <opencv2/opencv.hpp>
.上述 JNI 方式开发就是写原生的 C++代码调用 API,编译成功后会生成
.so
的文件,通过 JNI 方式加载这个库文件,或者升级更新这个库文件,不需要修改 Android 的文件.但是不能像 PC 下那样使用,如:imshow(),namedWindow(),createTrackBar(),waitKey(),这些函数是不能用.
谢谢支持
- 微信二维码:
- 联系作者