OpenCV4Android
前文曾详细探讨了关于OpenCV的使用,原本以为天下已太平。但不断有人反应依然配不好OpenCV4Android,不能得心应手的在Android上使用OpenCV,大量的精力都浪费在摸索配置上。尤其是OpenCVManager诞生之后,更让人无语,大家第一个反应就是如何才能不安装OpenCVManager,因为要多安装这个东西对客户来说体验太不好了。咱家昨夜研究至两点,今早七点起床,终于把头绪理清了。下面咱家以之前做过的一个基于OpenCV2.3.1,android通过jni调用opencv实现人脸检测的实例来逐个回答,如何在Android上使用Java接口而不安装OpenCVManager,及通过jni方式使用OpenCV的三种方式。
先来看JNI调OpenCV的三种方式。很多人会吃惊肿么JNI调OpenCV还会有3种方式,长久以来大量网上教程都说在Android上只有Java和JNI两种方式使用OpenCV,怎么又冒出来3种使用JNI的方式。经本人研究,确实有3种调JNI的方式,就连官网指导文档都模棱两可,所以让很多人不知所措。这三种方式分别是:
1、使用静态的OpenCV库的方式;
2、使用动态的OpenCV库的方式;
3、同时使用Java的API又使用JNI的接口的方式,此时编译时一般使用的是动态链接OpenCV库的方式。
要说明的是,这三种方式均无需安装OpenCVManager,区别在于mk文件的不同。个人最推崇的就是第一种方式,第一种方式也是和OpenCV2.3.1在JNI调OpenCV使用完全吻合的一种方式。本文是以windows平台最新的OpenCV-2.4.9-android-sdk为基础,使用2.4.9的OpenCV4Android需要使用NDK版本为r9,本人使用的是android-ndk-r9d的版本。之所以昨晚捣腾到2点,就是因为之前使用的ndk r7的版本,怎么编都编不过,因少东西报上千行错误。android-ndk-r9d安装十分简单,只需要解压缩配置一个环境变量即可。
一、Android以JNI调OpenCV的第一种配置方法:
Application.mk文件里的内容如下:
APP_STL:=gnustl_static
APP_CPPFLAGS:=-frtti -fexceptions
APP_ABI:= armeabi-v7a
这三种方式的Application.mk都一样,所以往后不说了。在Application.mk里还可以配置APP_PLATFORM=17类似这种,当然不配置完全可以。
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 D:\ProgramFile\OpenCV-2.4.9-android-sdk\sdk\native\jni\OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif
LOCAL_MODULE := ProcessImg
LOCAL_SRC_FILES := DetectFace_JNI.cpp \
src/copyToAssets.cpp \
src/detectFace.cpp
LOCAL_LDLIBS += -lm -llog
include $(BUILD_SHARED_LIBRARY)
逐一解释下,OpenCV_INSTALL_MODULES:=on的意思是自动将依赖的OpenCV的so库拷贝到libs目录下,但很遗憾的是,这个命令只对OPENCV_CAMERA_MODULES有效。只有当OPENCV_CAMERA_MODULES:=on时,可以看到他会自动将里面的带camera的so拷贝至工程下的libs文件夹下。include D:\ProgramFile\OpenCV-2.4.9-android-sdk\sdk\native\jni\OpenCV.mk这句话比较关键,这是我安装OpenCV-2.4.9-android-sdk的地方,我将其安装到了D盘。而我的工作空间在E盘也是ok的。而不用像OpenCV2.3.1使用时,限制这个解压缩包的位置了。LOCAL_MODULE 是要生成的库的名字,LOCAL_SRC_FILES 是jni文件夹下的cpp文件,其中的src说明我的jni下还有个子文件夹名字是“src”,这块替换成自己的源码文件就ok了。
为了测试的严谨性,在工程里将libs文件夹的东西,和obj文件夹下的东西全删了。用cygwin进到工程,输入ndk-build,看到如下信息:
<span style="font-family: 'Comic Sans MS';"><span style="font-size:18px;">Administrator@yanzi /cygdrive/e/WorkSpaces/OpenCV4Android/FaceDetectLiu2
$ ndk-build
Android NDK: WARNING: APP_PLATFORM android- is larger than android:minSdkVersion in ./AndroidManifest.xml
[armeabi-v7a] Cygwin : Generating dependency file converter script
[armeabi-v7a] Compile++ thumb: ProcessImg <= DetectFace_JNI.cpp
jni/DetectFace_JNI.cpp: In function '_jstring* Java_org_yan_processlib_LibProcessImg_processIplImg(JNIEnv*, jobject, jintArray, int, int)':
jni/DetectFace_JNI.cpp::: warning: converting 'false' to pointer type for argument of 'jint* _JNIEnv::GetIntArrayElements(jintArray, jboolean*)' [-Wconversion-null]
jni/DetectFace_JNI.cpp: In function '_jstring* Java_org_yan_processlib_LibProcessImg_processStaticImg(JNIEnv*, jobject, jintArray, int, int)':
jni/DetectFace_JNI.cpp::: warning: converting 'false' to pointer type for argument of 'jint* _JNIEnv::GetIntArrayElements(jintArray, jboolean*)' [-Wconversion-null]
[armeabi-v7a] Compile++ thumb: ProcessImg <= copyToAssets.cpp
[armeabi-v7a] Compile++ thumb: ProcessImg <= detectFace.cpp
[armeabi-v7a] SharedLibrary : libProcessImg.so
[armeabi-v7a] Install : libProcessImg.so => libs/armeabi-v7a/libProcessImg.so
</span></span>
上面两个警告么有关系,编译成功。生成的libProcessImg.so的大小为4M,整个apk大小为1.99M。
注意,如果将mk里的LOCAL_LDLIBS += -lm -llog这一句错误的写为:LOCAL_LDLIBS := -lm -llog,即将“+=”错写成了“:=”将会看到如下大量错误:
<span style="font-family: 'Comic Sans MS';"><span style="font-size:18px;">$ ndk-build
Android NDK: WARNING: APP_PLATFORM android- is larger than android:minSdkVersion in ./AndroidManifest.xml
[armeabi-v7a] Compile++ thumb: ProcessImg <= DetectFace_JNI.cpp
jni/DetectFace_JNI.cpp: In function '_jstring* Java_org_yan_processlib_LibProcessImg_processIplImg(JNIEnv*, jobject, jintArray, int, int)':
jni/DetectFace_JNI.cpp::: warning: converting 'false' to pointer type for argument of 'jint* _JNIEnv::GetIntArrayElements(jintArray, jboolean*)' [-Wconversion-null]
jni/DetectFace_JNI.cpp: In function '_jstring* Java_org_yan_processlib_LibProcessImg_processStaticImg(JNIEnv*, jobject, jintArray, int, int)':
jni/DetectFace_JNI.cpp::: warning: converting 'false' to pointer type for argument of 'jint* _JNIEnv::GetIntArrayElements(jintArray, jboolean*)' [-Wconversion-null]
[armeabi-v7a] Compile++ thumb: ProcessImg <= copyToAssets.cpp
[armeabi-v7a] Compile++ thumb: ProcessImg <= detectFace.cpp
[armeabi-v7a] SharedLibrary : libProcessImg.so
D:/ProgramFile/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: D:/ProgramFile\OpenCV-2.4.-android-sdk\sdk\native\jni\/../libs/armeabi-v7a/libopencv_core.a(persistence.cpp.o): in function icvGets(CvFileStorage*, char*, int):persistence.cpp(.text._ZL7icvGetsP13CvFileStoragePci+0x7e): error: undefined reference to 'gzgets'
D:/ProgramFile/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: D:/ProgramFile\OpenCV-2.4.-android-sdk\sdk\native\jni\/../libs/armeabi-v7a/libopencv_core.a(persistence.cpp.o): in function icvXMLSkipSpaces(CvFileStorage*, char*, int):persistence.cpp(.text._ZL16icvXMLSkipSpacesP13CvFileStoragePci+0x1c4): error: undefined reference to 'gzeof'
D:/ProgramFile/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: D:/ProgramFile\OpenCV-2.4.-android-sdk\sdk\native\jni\/../libs/armeabi-v7a/libopencv_core.a(persistence.cpp.o): in function icvYMLSkipSpaces(CvFileStorage*, char*, int, int) [clone .constprop.]:persistence.cpp(.text._ZL16icvYMLSkipSpacesP13CvFileStoragePcii.constprop.+0x122): error: undefined reference to 'gzeof'
D:/ProgramFile/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: D:/ProgramFile\OpenCV-2.4.-android-sdk\sdk\native\jni\/../libs/armeabi-v7a/libopencv_core.a(persistence.cpp.o): in function icvPuts(CvFileStorage*, char const*):persistence.cpp(.text._ZL7icvPutsP13CvFileStoragePKc+0x32): error: undefined reference to 'gzputs'
D:/ProgramFile/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: D:/ProgramFile\OpenCV-2.4.-android-sdk\sdk\native\jni\/../libs/armeabi-v7a/libopencv_core.a(persistence.cpp.o): in function icvClose(CvFileStorage*, std::string*):persistence.cpp(.text._ZL8icvCloseP13CvFileStoragePSs+0x132): error: undefined reference to 'gzclose'
D:/ProgramFile/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: D:/ProgramFile\OpenCV-2.4.-android-sdk\sdk\native\jni\/../libs/armeabi-v7a/libopencv_core.a(persistence.cpp.o): in function cvOpenFileStorage:persistence.cpp(.text.cvOpenFileStorage+0x1ac): error: undefined reference to 'gzrewind'
D:/ProgramFile/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: D:/ProgramFile\OpenCV-2.4.-android-sdk\sdk\native\jni\/../libs/armeabi-v7a/libopencv_core.a(persistence.cpp.o): in function cvOpenFileStorage:persistence.cpp(.text.cvOpenFileStorage+0x6d4): error: undefined reference to 'gzclose'
D:/ProgramFile/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: D:/ProgramFile\OpenCV-2.4.-android-sdk\sdk\native\jni\/../libs/armeabi-v7a/libopencv_core.a(persistence.cpp.o): in function cvOpenFileStorage:persistence.cpp(.text.cvOpenFileStorage+0x75a): error: undefined reference to 'gzopen'
D:/ProgramFile/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: D:/ProgramFile\OpenCV-2.4.-android-sdk\sdk\native\jni\/../libs/armeabi-v7a/libopencv_core.a(persistence.cpp.o): in function cvOpenFileStorage:persistence.cpp(.text.cvOpenFileStorage+0xd80): error: undefined reference to 'gzclose'
D:/ProgramFile/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: D:/ProgramFile\OpenCV-2.4.-android-sdk\sdk\native\jni\/../3rdparty/libs/armeabi-v7a/liblibpng.a(pngread.c.o): in function png_create_read_struct_2:pngread.c(.text.png_create_read_struct_2+0x112): error: undefined reference to 'inflateInit_'
D:/ProgramFile/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: D:/ProgramFile\OpenCV-2.4.-android-sdk\sdk\native\jni\/../3rdparty/libs/armeabi-v7a/liblibpng.a(pngread.c.o): in function png_read_row:pngread.c(.text.png_read_row+0x218): error: undefined reference to 'inflate'
D:/ProgramFile/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: D:/ProgramFile\OpenCV-2.4.-android-sdk\sdk\native\jni\/../3rdparty/libs/armeabi-v7a/liblibpng.a(pngread.c.o): in function png_read_destroy:pngread.c(.text.png_read_destroy+0x96): error: undefined reference to 'inflateEnd'
D:/ProgramFile/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: D:/ProgramFile\OpenCV-2.4.-android-sdk\sdk\native\jni\/../3rdparty/libs/armeabi-v7a/liblibpng.a(pngwrite.c.o): in function png_write_flush:pngwrite.c(.text.png_write_flush+0x1c): error: undefined reference to 'deflate'
</span></span>
上两张运行效果图,分别是预览界面检测人脸和拍照后检测:
二、Android以JNI调OpenCV的第二种配置方法
Application.mk文件同上,Android.mk文件如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OpenCV_INSTALL_MODULES:=on
OPENCV_CAMERA_MODULES:=off
OPENCV_LIB_TYPE:=SHARE
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
include D:\ProgramFile\OpenCV-2.4.9-android-sdk\sdk\native\jni\OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif
LOCAL_MODULE := ProcessImg
LOCAL_SRC_FILES := DetectFace_JNI.cpp \
src/copyToAssets.cpp \
src/detectFace.cpp
LOCAL_LDLIBS := -lm -llog
include $(BUILD_SHARED_LIBRARY)
唯一的变化时将OPENCV_LIB_TYPE:=STATIC 变成了SHARE.即通过动态链接的方式连接OpenCV的so。编译信息如下:
<span style="font-size:18px;">Administrator@yanzi /cygdrive/e/WorkSpaces/OpenCV4Android/FaceDetectLiu2
$ ndk-build
Android NDK: WARNING: APP_PLATFORM android- is larger than android:minSdkVersi on in ./AndroidManifest.xml
Android NDK: WARNING:jni/Android.mk:ProcessImg: non-system libraries in linker f lags: -lopencv_java
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_S TATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependenc ies of the
Android NDK: current module
[armeabi-v7a] Compile++ thumb: ProcessImg <= DetectFace_JNI.cpp
jni/DetectFace_JNI.cpp: In function '_jstring* Java_org_yan_processlib_LibProces sImg_processIplImg(JNIEnv*, jobject, jintArray, int, int)':
jni/DetectFace_JNI.cpp::: warning: converting 'false' to pointer type for ar gument of 'jint* _JNIEnv::GetIntArrayElements(jintArray, jboolean*)' [-Wconver sion-null]
jni/DetectFace_JNI.cpp: In function '_jstring* Java_org_yan_processlib_LibProces sImg_processStaticImg(JNIEnv*, jobject, jintArray, int, int)':
jni/DetectFace_JNI.cpp::: warning: converting 'false' to pointer type for a rgument of 'jint* _JNIEnv::GetIntArrayElements(jintArray, jboolean*)' [-Wconve rsion-null]
[armeabi-v7a] Compile++ thumb: ProcessImg <= copyToAssets.cpp
[armeabi-v7a] Compile++ thumb: ProcessImg <= detectFace.cpp
[armeabi-v7a] SharedLibrary : libProcessImg.so
D:/ProgramFile/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: warning: hidden symbol '__aeabi_atexit' in D:/ProgramFile/android-ndk-r9d/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/libgnustl_static.a(atexit_arm.o) is referenced by DSO D:/ProgramFile\OpenCV-2.4.-android-sdk\sdk\native\jni\/../libs/armeabi-v7a/libopencv_java.so
[armeabi-v7a] Install : libProcessImg.so => libs/armeabi-v7a/libProcessImg.so
</span>
可以看到上面说找不到non-system libraries in linker flags: -lopencv_java这个东西,关于这个问题我曾作如下尝试:
LOCAL_LDLIBS += -lopencv_java 或 LOCAL_SHARED_LIBRARIES += libopencv_java均没有解决这个warning。原本运行正常的程序报错如下:
java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libopencv_java.so" needed by "libProcessImg.so"; caused by load_library(linker.cpp:745): library "libopencv_java.so" not found
说是自己编译的这个库libProcessImg.so依赖于libopencv_java.so,没有找到它所以程序挂了。再看生成的libProcessImg.so大小为437KB,比第一种方式少了好几倍啊。肿么让程序正常运行呢?将安装目录D:\ProgramFile\OpenCV-2.4.9-android-sdk\sdk\native\libs\armeabi-v7a下的libopencv_java.so拷贝到libs\armeabi-v7a文件夹下,然后再调用库的时候方法变更为:
<span style="font-size:18px;">package org.yan.processlib;
public class LibProcessImg {
static{
System.loadLibrary("opencv_java");
System.loadLibrary("ProcessImg");
} public static native void initProcessLib(String str);
public static native String processIplImg(int[] buf, int w, int h);
public static native String processStaticImg(int[] buf, int w, int h);
}
</span>
先调用这个依赖的库,然后调用我们自己的,注意这个libopencv_java.so有9M多。如此程序又可以正常运行了。最终apk的大小为4.83M,是第一种的2倍,但还没大的离谱,可以接受。
对比上面两种方法不难发现,虽然在mk里都有include $(BUILD_SHARED_LIBRARY) 也即生成的库都是动态库,但这个库指的是我们自己写的,我们的库要进一步调用OpenCV的库,否则的话直接就能用OpenCV库里的函数,咋可能有这事呢。至于怎么调OpenCV的库,可以静态,也可以动态。这也就是为什么第二种方法生成的so的大小只有437KB,而第一种方法生成的库有4M的大小。事实上在我们第一种方式ndk-build的时候会发现有大量的各种.a .a被加载进去的情形,只不过这只出现一次,原因就在这。打开安装目录下的libs:
可以看到除了带Camera的so外,其他大量都是.a,而且这些.a是按包名划分的。而so只有libopencv_java.so和libopencv_info.so,在功能上这些.a静态调用时等同于动态加载这两个so。之所以这么多.a就是供我们采用第一种方法时使用的。关于静态和动态的优缺点参见这里
第三种方法:java和jni混用
搞完第二种,既然动态加载我表面上没用libopencv_java.so,还要把它加载进来,那我干脆为啥不用用java的api呢?既然要用java的api那肯定要jar包弄进来,于是导进来OpenCV Library - 2.4.9工程如下图所示:
这样就可以用java的api了。如果你有强迫症,觉得OpenCV Library - 2.4.9这个工程一直开着心里不爽,那也可以将sdk bin目录生成的opencv library - 2.4.9.jar拷贝到自己工程的libs文件夹下,记得将刚才添加的Libraries remove掉。右键opencv library - 2.4.9.jar----------build path--------------add to build path,这样照样使用Java的api。其实这块很明显,只要jar包弄进去了你就可以正常使用api了,即编译时不报错,但apk到手机上能不能正常运行则是另一码子事。
此时的mk文件跟第二种类似,记得把libopencv_java.so拷贝到相应目录。相较于第二种,并没有增加什么,仅仅是开发时将jar包导入就可以正常编译了,能否正常运行还依赖于libopencv_java.so。需注意的是,每clean一次,这个libopencv_java.so就会不见一次,还要手动拷或者自己写个脚本拷。最终apk的大小为4.94M,相比第二种多点,原因是那个jar包的原因,以及我们代码里又加了几句:
<span style="font-size:18px;">package org.yan.processlib;
import org.opencv.android.OpenCVLoader;
import android.util.Log;
public class LibProcessImg {
static{
if(!OpenCVLoader.initDebug()){
Log.i("yanzi", "OpenCVLoader.initDebug() 失败");
}else{
System.loadLibrary("opencv_java");
System.loadLibrary("ProcessImg");
}
}
public static native void initProcessLib(String str);
public static native String processIplImg(int[] buf, int w, int h);
public static native String processStaticImg(int[] buf, int w, int h);
}
</span>
当然你可以加其他的很多OpenCV的java接口,比如Bitmap转mat,直接传Mat指针到jni等等,随便自己怎么玩。官网上的JNI使用OpenCV其实就是这种java和jni混用的情况,其实大多情况下么有啥必要,看个人了。至于动态加载OpenCV的库还是静态,也全看个人,我是倾向于第一种,以apk的体积最清爽为准。
我们用initDebug一下,其实这块你不写也行的。另外就是这个加载库用static方法跟放Activity里的onResume里差不多,我是习惯了放单独的一个静态方法里。记住千万不要用OpenCVLoader.initAsync()方法啊,本文的主线就是不用OpenCVManager!!!
最后我们打开一个OpenCV_2.4.9_Manager_2.18_armv7a-neon.apk来看一下:
哈哈,看到了吧,里面的精髓就是lib下的so以及那个引擎so。在使用OpenCVManager的情况下,这些库随着OpenCVManager.apk的装入都事先安装到手机了,不论是使用java也好,还是用jni再使用动态链接OpenCV库的方法(使自己的so体积最小),都不用往libs文件夹额外加so了,因为so随着OpenCVManager已安好了。这就是之所以加个OpenCVManager的半个初衷啊,另半个初衷是binder service 框架上的原因!!!
最后补充3点:
1.有时Cygwin会有记忆效应,比如你修改了mk里从static变成share,但是它还是按照static来编译的。解决方法是退了重新进,或重启电脑吧,汗。
2.除了ndk-build命令外,还应该记住ndk-build -B 强制全编 和 ndk-build clean 清理 这两个命令。
3.有些教程用到jni时还要把工程转成C++工程,再配置ndk-build.cmd命令,其实这个在前文也曾说过。个人觉得真心么必要啊。
------------------------本文系原创,转载请注明作者:yanzi1225627
OpenCV4Android的更多相关文章
- OpenCV4Android开发之旅(一)----OpenCV2.4简介及 app通过Java接口调用OpenCV的示例
转自: http://blog.csdn.net/yanzi1225627/article/details/16917961 开发环境:windows+ADT Bundle+CDT+OpenCV-2 ...
- installation and configuration of OpenCV4Android SDK
http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/O4A_SDK.html#running-opencv ...
- !! This tutorial was designed to help you with installation and configuration of OpenCV4Android SDK.
ref: http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/O4A_SDK.html#running-o ...
- OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)
OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰) 前文曾详细探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反 ...
- Opencv4android的Android Studio项目配置及实例下载
因为软件竞赛的项目会用到Opencv fo rAndroid,所以就研究了一下如何在Android Studio上配置Opencv4Android 环境概述: Android Studio 2.3 O ...
- OpenCV4Android背景建模(MOG、MOG2)
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 很久以前的笔记了,分享给大家吧...OpenCV4Android中用于背景建模的类主要 ...
- Windows编译OpenCV4Android解决undefined reference to std错误
注意OpenCV 4.0.1 解决了这个问题请直接下载OpenCV 4.0.1 但是OpenCV 4.0.1作为模块导入Android Studio会有找不到R.styleable的问题 OpenCV ...
- 在Android Studio2.3中配置OpenCV4Android SDK
在Android Studio2.3中配置OpenCV4Android SDK 一,OpenCV4Android下载地址 [2.4.11]http://onhdz331f.bkt.clouddn.co ...
- OpenCV4Android安装
转:http://blog.csdn.net/gao_chun/article/details/49359535 1.下载及目录介绍 2.将 OpenCV引入 Android Studio 3.更新 ...
随机推荐
- MyBatis学习(一)简介及入门案例
1.什么是MyBatis? MyBatis是一个支持普通SQL查询,存储过程,和高级映射的优秀持久层框架.MyBatis去掉了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBati ...
- oracle "记录被另一个用户锁定"
出现的原因是有人对某一条数据进行了修改,oracle会通过这个事务记住这条数据,若修改的人没有进行提交或进行回滚记录,oracle是不允许对这条数据在此进行修改的,在这种情况下你要进行修改数据,则会被 ...
- angularjs之ui-bootstrap的Datepicker Popup实现双日期选择控件
最开始使用ui-bootstrap的Datepicker Popup日期选择插件实现双日期选择时间范围时,在网上搜了一些通过JS去实现的方法,不过后来发现可以不必通过JS去处理,只需要使用其自身的属性 ...
- vue2.0 网页标题更新实现思路
一.注册全局指令 1.注册一个全局指令 Vue.directive('title', { inserted: function (el, binding) { document.title = el. ...
- 程序员的自我修养九Windows下的动态链接
9.1 DLL简介 DLL即动态链接库的缩写,它相对于Linux下的共享对象. Windows下的DLL文件和EXE文件实际上是一个概念,它们都是有PE格式的二进制文件. 微软希望通过DLL机制加强软 ...
- iOS 获取设备信息,mac地址,IP地址,设备名称
#import "DeviceInfoUtil.h" #import "GlobleData.h" #import "sys/utsname.h&qu ...
- asp.net core后台系统登录的快速构建
登录流程图 示例预览 构建步骤 当然,你也可以直接之前前往coding仓库查看源码,要是发现bug记得提醒我啊~ LoginDemo地址 1. 首先你得有一个项目 2. 然后你需要一个登录页面 完整L ...
- Huge Mission
Huge Mission Problem Description Oaiei is busy working with his graduation design recently. If he ca ...
- poj2823一道纯单调队列
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 32099 Accepted: 9526 ...
- ASP.NET没有魔法——目录
ASP.NET没有魔法——开篇-用VS创建一个ASP.NET Web程序 ASP.NET没有魔法——为什么使用ASP.NET ASP.NET没有魔法——第一个ASP.NET应用<MyBlog&g ...