前言
最近做人脸检测识别时有个新需求需要做活体检测,在网上查来查去,说用opencv可以实现,暂时还没找到完整参照。但是opencv有个人脸特征点landmark检测,这个可能需要用到。先搭好安卓环境,看看情况
正文
开发环境搭建
这里有个参考文章:
https://blog.csdn.net/fxjzzyo/article/details/86650133
注意里面,sdk的位置啊,.so的的名称啊,要跟你下载的一致,我用的opencv4.0版本
具体步骤:
1) 拷贝opencv java代码到项目中,或者以module方式,或者以jar方式导入
2)拷贝so文件到src/main/jniLibs中
3)配置 app/build.gradle, 向android模块添加以下内容,告知so的位置,以便运行时正确调用
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
4)编写cpp的jni代码
5) 编写正确的cmakelists.txt内容
//引入opencv库
#支持-std=gnu++11
set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
#配置加载native依赖
include_directories(include) #将opencv的include拷贝到cpp下
#动态方式加载opencv
add_library(lib_opencv STATIC IMPORTED ) #表示创建一个导入库,静态方式
#引入libopencv_java4.so文件
set_target_properties(lib_opencv
PROPERTIES
IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libopencv_java4.so
)
//编译so
add_library( # Sets the name of the library.
opencv-test
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
jni/jni-opencvtest.cpp
)
//编译时链接库
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log)
target_link_libraries( # Specifies the target library.
opencv-test
# Links the target library to the log library
# included in the NDK.
${log-lib}
android -ljnigraphics
lib_opencv)
6)运行时需要加载opencv的so,和自己的so
static {
try {
System.loadLibrary("opencv_java4");
System.loadLibrary("opencv-xxx");
}catch (Exception e){
Log.e(TAG,"load opencv-xxx failed");
}
}
- 编译生成的so位于 app/build/intermediates/cmake/debug/obj
问题收集:
1.这时候可能会碰到一个问题:
opencv2标红,Mat标红。
其实cmakelist中引入了so后应该就可以了,这时候直接build->make project
2.接着碰到第二个问题:
提示Mat错误,是不是应该用cv::Mat
看到这个提示我就放心了,提示我用cv了,说明路子对了,将代码改为
继续build->make project,最后你会和我一样发现上面的标红都变正常了。run一下跑程序
3.第三个问题:java报错
No implementation found for int[] com.xxx.xxx.MainActivity.gray(int[], int, int)
出现这个问题有两个可能:
一是你的native方法名没有按规则来;这个没问题
二是没有打包到apk中,用之前说的分析包工具看看
一切正常
三是没有引用到,什么意思呢,其实as已经提示了,我的方法是暗色的,没有被引用到
最后发现是开头少了 extern “C”,加上后恢复正常
然后运行
小结
还好以前安卓还有点点印象,感谢大佬带路