参考基于android studio开发的 opencv关于android人脸识别的DEMO
前言
/build/core/add-application.mk:178: *** Android NDK: APP_STL gnustl_shared is no longer supported. Please switch to either c++_static or c++_shared. See https://developer.android.com/ndk/guides/cpp-support.html for more information. . Stop.
[armeabi-v7a] SharedLibrary : libface_detection.so
G:/software/android/projects/opencv/CameraTutorial/app/src/jni/haar_detect.cpp:39: error: undefined reference to 'cv::CascadeClassifier::detectMultiScale(cv::_InputArray const&, std::__ndk1::vector
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [G:/software/android/projects/opencv/CameraTutorial/app/src/obj/local/armeabi-v7a/libface_detection.so] Error 1
如果有人遇到以上报错可以参考我的 解决android studio3 导入opencv后ndk-build编译遇到的问题
本文不会有上述两个报错
Android studio使用的3.0版本。下载的ndk是19。
opencv从官网下载的4.0
下载后的opencv目录如下
OpenCV-android-sdk
-samples
-sdk
这次我们用的人脸识别项目就是OpenCV-android-sdk\samples\face-detection
这个目录下的FdActivity.java文件是人脸识别的界面程序,打开看下
package org.opencv.samples.facedetect;
第一行是包名一会我们新建一个和这个包名一样的程序就能少改好多了
这是我新建的工程 ,其他的都无所谓包名是org.opencv.samples.facedetect。如果不是也没关系,可以在工程里再新建一个,反正需要一个org.opencv.samples.facedetect
这里要选到java文件夹,我把下面的module name改成了opencv4
找到project structure 到app下点那个加号,选择opencv4
到这个目录下复制一下下面这几个库,都加上也行,我只复制了armeabi-v7a
然后粘贴到了libs下
我把这个AndroidManifest.xml删掉了
然后打开app下的build.gradle看一下这三个数
opencv4下的build gradle改成与上面一样的
往下翻,然后修改一下下面这个
ok,没有错误。到这里opencv4的工程就导入成功了
下面导入例程测试效果
到OpenCV-android-sdk\samples\face-detection\src\org\opencv\samples\facedetect目录下复制一下这两个文件
拷贝到app - src - main - java - org.opencv.samples.facedetect下
复制xml拷贝到app src res layout下
例程的raw有个xml模型
直接复制下raw文件夹
粘贴到app - src - main res下
新建一个jni文件夹
复制这下面四个文件
拷贝到jni下
Android.mk和Application.mk文件我做了修改
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
include G:/software/android/opencv-4.0.1-android-sdk/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk
LOCAL_MODULE := detection_based_tracker
LOCAL_SRC_FILES := DetectionBasedTracker_jni.cpp
LOCAL_LDLIBS += -llog -ldl
include $(BUILD_SHARED_LIBRARY)
注意这里面第5行的include要与你的opencv.mk路径对应
APP_STL := c++_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-16
修改app下的build.gradle加入ndk编译的命令
externalNativeBuild{
ndkBuild{
path "src/jni/Android.mk"}
}
这个path对应的路径就是jni下的android.mk路径
修改app的AndroidManifest.xml
启动文件改成FdActivity
然后添加使用摄像头的权限
这时下面这两个文件就没用了,删除也可以
编译一下没有问题
连接手机,run
没问题
1安装后要自己到手机设置里开启相机权限
2照相机的正方向是手机斜放(横着),竖向的图片是翻转的,这里就不修改了。
找个百度的图片试下,没问题
最后生成可导出的apk
点击generate
这里可以选择choose existing 也可以选择create new。为了演示我选择create new
到这个界面,第一个是要存放的key路径
我先新建一个key文件夹
选择这个目录
然后剩下的密码用户名就随便了
next
选了v1,。finish
找到这个文件夹。恩,真的有了。
这个apk就可以拷贝到别的安卓设备测试了