opencv for android:如何在Android studio中成功运行opencv人脸识别的例子
2016-08-24 20:15
399 查看
opencv官网上关于Android的大多是在eclipse下运行的,网上关于在Android studio中运行的博客都比较少,大多数是灰度化等比较简单的例子,如何在android studio 中运行成功人脸识别的例子?过程如下:
1.在官网上下载opencv的SDK,把opencv的SDK下的native 文件夹都拷到项目文件夹下
2. 新建一个jni目录,在main包下
3. 在jni目录下,新建两个文件,分别为Android.mk和Application.mk,如图
4. 在gradle.properties文件里面添加这样一句话
5. 配置好ndk目录,在Android studio中使用NDK不用在系统中配置环境变量
如果不清楚怎么配置NDK,可以在网上随便找找,网上这方面资料挺多
6. 在app的build.gradle中,在Android节点下添加下面这段话
7.在Application.mk和Android.mk中分别添加下面内容,注意不要讲两个填反了
在Application.mk中:
在Android.mk中:
8.Ndk build一下,展开右方gradle,找到ndkbuild,双击,如图所示:
成功后,会如图显示:
能成功build出so说明没有问题,并且如下图所示会多两个文件夹:
10.把opencv下org文件夹拷到项目main/java目录下,Value下的attr.xml也拷进来res/value下
11.build一下
这时可能会报这个错误
解决办法:
在main下新建一个aidl文件夹
把org.opencv.engine拷入这个文件夹下
如果报错说aidl.exe错误,把这个包名改一下,注意光标处
12.Rebuild一下,没有报其他错误,这时可以把opencv sample中人脸识别的例子拷进来包括Java代码,布局文件,raw文件夹
再次rebuild
13.在terminal下cd到这个文件夹下
运行命令 Javah 包名+DetectionBasedTracker
此时生成了一个.h头文件,把它拷到jni目录下
14.(1)新建一个和头文件同样文件名的cpp文件
(2)把原示例项目face-detection中jni目录下cpp文件的内容拷入你的cpp文件中 (3)注意红色箭头的地方将.h文件include进去
15.下面用Java开头的方法即是Java代码可能调用的方法,这个地方的方法名需要修改为头文件中对应的方法名,因为从样本中拷入的代码的包名是样本的包名,应该是你自己的包名,这些包名在头文件中已经声明了,所以只需要一一复制过来
16.在Android.mk里面把这个cpp加进去
改一下生成的so文件的名字
17.此时,可以ndkbuild一下,生成出来的so文件如果只有几k,说明C++文件没有编进去
18.新建一个文件夹,命名为jniLibs将native/libs下的armeabi和armeabi-v7a拷过来,如图
如果此时报错
是因为这个terminal下正在占用,cd出去就行了
19.把这几句画复制到你的项目中
然后应该就可以了
1.在官网上下载opencv的SDK,把opencv的SDK下的native 文件夹都拷到项目文件夹下
2. 新建一个jni目录,在main包下
3. 在jni目录下,新建两个文件,分别为Android.mk和Application.mk,如图
4. 在gradle.properties文件里面添加这样一句话
android.useDeprecatedNdk=true
5. 配置好ndk目录,在Android studio中使用NDK不用在系统中配置环境变量
如果不清楚怎么配置NDK,可以在网上随便找找,网上这方面资料挺多
6. 在app的build.gradle中,在Android节点下添加下面这段话
sourceSets.main.jni.srcDirs = [] //禁止自带的ndk功能 sourceSets.main.jniLibs.srcDirs = ['src/main/libs','src/main/jniLibs'] //重定向so目录为src/main/libs和src/main/jniLibs,原来为src/main/jniLibs task ndkBuild(type: Exec, description: 'Compile JNI source with NDK') { Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) def ndkDir = properties.getProperty('ndk.dir') if (org.apache.tools.ant.taskdefs.condition.Os.isFamily(org.apache.tools.ant.taskdefs.condition.Os.FAMILY_WINDOWS)) { commandLine "$ndkDir/ndk-build.cmd", '-C', } else { commandLine "$ndkDir/ndk-build", '-C', file('src/main/jni').absolutePath } } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn ndkBuild } task ndkClean(type: Exec, description: 'Clean NDK Binaries') { Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) def ndkDir = properties.getProperty('ndk.dir') if (org.apache.tools.ant.taskdefs.condition.Os.isFamily(org.apache.tools.ant.taskdefs.condition.Os.FAMILY_WINDOWS)) { commandLine "$ndkDir/ndk-build.cmd",'clean', '-C', file('src/main/jni').absolutePath } else { commandLine "$ndkDir/ndk-build",'clean', '-C', file('src/main/jni').absolutePath } } clean.dependsOn 'ndkClean'
7.在Application.mk和Android.mk中分别添加下面内容,注意不要讲两个填反了
在Application.mk中:
APP_STL := gnustl_static APP_CPPFLAGS := -frtti -fexceptions APP_ABI := armeabi armeabi-v7a APP_PLATFORM := android-8
在Android.mk中:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) OpenCV_INSTALL_MODULES := on OpenCV_CAMERA_MODULES := off OPENCV_LIB_TYPE :=STATIC ifeq ("$(wildcard $(OPENCV_MK_PATH))","") include ..\..\..\..\native\jni\OpenCV.mk else include $(OPENCV_MK_PATH) endif LOCAL_MODULE := detection_based_tracker LOCAL_SRC_FILES :=com_example_facetest_DetectionBasedTracker.cpp LOCAL_LDLIBS += -lm -llog include $(BUILD_SHARED_LIBRARY)
8.Ndk build一下,展开右方gradle,找到ndkbuild,双击,如图所示:
成功后,会如图显示:
能成功build出so说明没有问题,并且如下图所示会多两个文件夹:
10.把opencv下org文件夹拷到项目main/java目录下,Value下的attr.xml也拷进来res/value下
11.build一下
这时可能会报这个错误
解决办法:
在main下新建一个aidl文件夹
把org.opencv.engine拷入这个文件夹下
如果报错说aidl.exe错误,把这个包名改一下,注意光标处
12.Rebuild一下,没有报其他错误,这时可以把opencv sample中人脸识别的例子拷进来包括Java代码,布局文件,raw文件夹
再次rebuild
13.在terminal下cd到这个文件夹下
运行命令 Javah 包名+DetectionBasedTracker
此时生成了一个.h头文件,把它拷到jni目录下
14.(1)新建一个和头文件同样文件名的cpp文件
(2)把原示例项目face-detection中jni目录下cpp文件的内容拷入你的cpp文件中 (3)注意红色箭头的地方将.h文件include进去
15.下面用Java开头的方法即是Java代码可能调用的方法,这个地方的方法名需要修改为头文件中对应的方法名,因为从样本中拷入的代码的包名是样本的包名,应该是你自己的包名,这些包名在头文件中已经声明了,所以只需要一一复制过来
16.在Android.mk里面把这个cpp加进去
LOCAL_SRC_FILES :=com_example_facetest_DetectionBasedTracker.cpp
改一下生成的so文件的名字
17.此时,可以ndkbuild一下,生成出来的so文件如果只有几k,说明C++文件没有编进去
18.新建一个文件夹,命名为jniLibs将native/libs下的armeabi和armeabi-v7a拷过来,如图
如果此时报错
是因为这个terminal下正在占用,cd出去就行了
19.把这几句画复制到你的项目中
然后应该就可以了
相关文章推荐
- Android-图像识别项目OpenCV(2):运行官方例子中的脸部识别程序
- Android之如何解决Android studio运行出现的HAX kernel modules is not installed
- Android-图像识别项目OpenCV(2):运行官方例子中的脸部识别程序
- 如何将android例子程序添加到Eclipse进行调试运行
- Android Studio配置并运行OpenCV4Android的face-detection
- 如何将android例子程序添加到Eclipse进行调试运行
- 如何将Android例子程序添加到Eclipse进行调试运行(转载)
- 如何成功运行SDL官方提供的Android平台的Demo
- 【Android】Android Studio使用OpenCV后,使APP不安装OpenCV Manager即可运行
- 如何成功运行SDL官方提供的Android平台的Demo
- Android-图像识别项目OpenCV(2):运行官方例子中的脸部识别程序
- 如何将android例子程序添加到Eclipse进行调试运行
- Eclipse开发Android程序如何在手机上运行
- 如何在Android模拟器上运行Adobe的Android程序
- 如何配置 android 运行环境 ;如何卸载 ADT
- 如何配置 android 运行环境 ;如何卸载 ADT
- 关于android如何获取屏幕分辨率的例子
- Android如何运行真机在eclipse上调试应用?
- 在命令行提示符下如何成功运行含有包命令的Java程序
- 如何在android系统上运行C语言的程序