RIGUZ Lee

在Android 上使用 OpenCV

2017-11-13 / Programing / Android

如题,本文将记录如何在安卓上调用OpenCV。

导入OpenCV动态库

首先当然是下载OpenCV for Android了,然后使用Android Studio创建一个工程并勾选C++ support。

然后,把OpenCV-android-sdk里面的native目录拷贝到工程中,例如app/opencv这个目录,需要修改以下文件:

  • app/build.gradle
android {
....
sourceSets {
        main {
            jniLibs.srcDirs = ['opencv/libs']
        }
    }
}

这样做的目的是为了打包的时候能自动将opencv/libs/{arch}/libopencv_java3.so这个文件打包到我们的apk中。

  • app/CMakeList.txt
set(opencv "${CMAKE_SOURCE_DIR}/opencv")
include_directories(${opencv}/jni/include)
add_library(libopencv_java3 SHARED IMPORTED )
set_target_properties(libopencv_java3 PROPERTIES
                      IMPORTED_LOCATION "${opencv}/libs/${ANDROID_ABI}/libopencv_java3.so")

target_link_libraries( # Specifies the target library.
                       native-lib
                       libopencv_java3
                       ${log-lib} )

这里把opencv作为动态库链接到工程中,并添加了包含目录,否则在编译cpp的时候会找不到opencv的头文件。

导入OpenCV Jaba Module

把opencv sdk下面的java目录作为一个module导入到工程中,并设置app依赖此module,这样就可以在工程中使用opencv提供的java接口了。我们来做一个相机:

这里首先实现CvCameraViewListener2接口,来实现相机的处理。

在create的时候,我们申请权限,然后设置相机view的监听为自身。

相机启动停止我们不需要做别的操作。

相机继续的时候,我们重新加载OpenCV库。

暂停和销毁的时候,我们把相机禁用掉。

这是关键的一步,处理相机的一帧。我们队图像进行了旋转,否则图像的坐标和我们的预期的是不一致的。注意在OpenCV3.2的时候,引入了便捷的rotate函数,如果用之前的方法,可能需要flip和reverse来实现了。

最后是权限的动态申请。当然了,在AndroidManifest.xml中也需要进行设置,我们直接贴代码了:

参考:Use OpenCV to show camera on android App with correct orientation