AR技术之--基于opencv的人脸识别(三)
2016-06-27 21:18
891 查看
下面开始讲第一种方法,纯jni层的代码,该方法基于上面的所有步骤,为静态链接库
声明java层的native方法
<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal;"><span style="font-family:FangSong_GB2312;font-size:12px;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> OpenCVHelper { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> { System.loadLibrary(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"OpenCV"</span>); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> native <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>[] <span class="hljs-title" style="box-sizing: border-box;">gray</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>[] buf, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> w, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> h); } </span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:FangSong_GB2312;font-size:12px;">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:FangSong_GB2312;font-size:12px;">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:FangSong_GB2312;font-size:12px;">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:FangSong_GB2312;font-size:12px;">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:FangSong_GB2312;font-size:12px;">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:FangSong_GB2312;font-size:12px;">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:FangSong_GB2312;font-size:12px;">7</span></li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:FangSong_GB2312;font-size:12px;">1</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:FangSong_GB2312;font-size:12px;">2</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:FangSong_GB2312;font-size:12px;">3</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:FangSong_GB2312;font-size:12px;">4</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:FangSong_GB2312;font-size:12px;">5</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:FangSong_GB2312;font-size:12px;">6</span></li><li style="box-sizing: border-box; padding: 0px 5px;"><span style="font-family:FangSong_GB2312;font-size:12px;">7</span></li></ul>
使用javah命令生成头文件,内容如下
<code class="hljs vala has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"><span style="font-family:FangSong_GB2312;font-size:12px;"></span></span></code><pre style="background-color: rgb(255, 255, 255);"><span style="font-family:FangSong_GB2312;font-size:12px;"><span style="color:#808080;"><em>/* DO NOT EDIT THIS FILE - it is machine generated */ </em></span><span style="color:#808000;">#include</span><span style="color:#008000;"><strong> <jni.h> </strong></span><span style="color:#808080;"><em>/* Header for class com_lisc_android_opencv_lib_OpenCVHelper */ </em></span><span style="color:#808080;"><em> </em></span><span style="color:#808000;">#ifndef </span>_Included_com_lisc_android_opencv_lib_OpenCVHelper <span style="color:#808000;">#define </span>_Included_com_lisc_android_opencv_lib_OpenCVHelper <span style="color:#808000;">#ifdef </span>__cplusplus <span style="color:#000080;"><strong>extern </strong></span><span style="color:#008000;"><strong>"C" </strong></span>{ <span style="color:#808000;">#endif </span><span style="color:#808080;"><em>/* </em></span><span style="color:#808080;"><em> * Class: com_lisc_android_opencv_lib_OpenCVHelper </em></span><span style="color:#808080;"><em> * Method: gray </em></span><span style="color:#808080;"><em> * Signature: ([III)[I </em></span><span style="color:#808080;"><em> */ </em></span>JNIEXPORT jintArray JNICALL Java_com_lisc_android_opencv_lib_OpenCVHelper_gray (JNIEnv *, jclass, jintArray, jint, jint); <span style="color:#808000;">#ifdef </span>__cplusplus } <span style="color:#808000;">#endif </span><span style="color:#808000;">#endif</span></span>
2
3
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
使用javah生成头文件的方法如下:
命令行模式,来到main/java目录下,输入java com.lisc.android.opencv.lib.OpenCVHelper后,
在main/java目录下会生成com_lisc_android_opencv_lib_OpenCVHelper.h文件
新建cpp文件,实现对应的方法,就是灰度处理
<span style="font-family:FangSong_GB2312;font-size:12px;">#include "com_lisc_android_opencv_lib_OpenCVHelper.h" #include <stdio.h> #include <stdlib.h> #include <opencv2/opencv.hpp> using namespace cv; extern "C" { JNIEXPORT jintArray JNICALL Java_com_lisc_android_opencv_lib_OpenCVHelper_gray( JNIEnv *env, jclass obj, jintArray buf, int w, int h); JNIEXPORT jintArray JNICALL Java_com_lisc_android_opencv_lib_OpenCVHelper_gray( JNIEnv *env, jclass obj, jintArray buf, int w, int h) { jint *cbuf; cbuf = env->GetIntArrayElements(buf, JNI_FALSE ); if (cbuf == NULL) { return 0; } Mat imgData(h, w, CV_8UC4, (unsigned char *) cbuf); uchar* ptr = imgData.ptr(0); for(int i = 0; i < w*h; i ++){ //计算公式:Y(亮度) = 0.299*R + 0.587*G + 0.114*B //对于一个int四字节,其彩色值存储方式为:BGRA int grayScale = (int)(ptr[4*i+2]*0.299 + ptr[4*i+1]*0.587 + ptr[4*i+0]*0.114); ptr[4*i+1] = grayScale; ptr[4*i+2] = grayScale; ptr[4*i+0] = grayScale; } int size = w * h; jintArray result = env->NewIntArray(size); env->SetIntArrayRegion(result, 0, size, cbuf); env->ReleaseIntArrayElements(buf, cbuf, 0); return result; } }</span>
之后,需要将cpp文件编译进去,在Andorid.mk文件中加入
LOCAL_SRC_FILES := com_lisc_android_opencv_lib_OpenCVHelper.cpp
在java层写测试代码,测试一下
Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(R.mipmap.keroro)).getBitmap(); int w = bitmap.getWidth(), h = bitmap.getHeight(); int[] pix = new int[w * h]; bitmap.getPixels(pix, 0, w, 0, 0, w, h); int[] resultPixes = OpenCVHelper.gray(pix, w, h); Bitmap result = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565); result.setPixels(resultPixes, 0, w, 0, 0, w, h); mIV.setImageBitmap(result);
结果在编译的时候遇到了以下错误
下午1:25:12: Executing external task 'ndkBuild'...
Incremental java compilation is an incubating feature.
:android-opencv-library:ndkBuild
Android NDK: WARNING:/Users/lisc/Documents/examples/ar/android-opencv-library/src/main/jni/Android.mk:OpenCV: non-system libraries in linker flags: -lopencv_java3
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
Android NDK: WARNING:/Users/lisc/Documents/examples/ar/android-opencv-library/src/main/jni/Android.mk:OpenCV: non-system libraries in linker flags: -lopencv_java3
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
make: *** No rule to make target `/Users/lisc/Documents/examples/ar/android-opencv-library/src/main/jni/com_lisc_android_opencv_lib_OpenCVHelper.cpp', needed by `/Users/lisc/Documents/examples/ar/android-opencv-library/src/main/obj/local/armeabi/objs/OpenCV/com_lisc_android_opencv_lib_OpenCVHelper.o'.
Stop.
:android-opencv-library:ndkBuild FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':android-opencv-library:ndkBuild'.
> Process 'command '/Users/lisc/Library/Android/sdk/ndk-bundle/ndk-build'' finished with non-zero exit value 2
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 3.501 secs
Process 'command '/Users/lisc/Library/Android/sdk/ndk-bundle/ndk-build'' finished with non-zero exit value 2
下午1:25:16: External task execution finished 'ndkBuild'.
检查发现,com_lisc_android_opencv_lib_OpenCVHelper.h和com_lisc_android_opencv_lib_OpenCVHelper.cpp文件
要移动main/jni目录下,和Android.mk保持在同一个目录下,再次编译通过
下午1:42:37: Executing external task 'ndkBuild'...
Incremental java compilation is an incubating feature.
:android-opencv-library:ndkBuild
Android NDK: WARNING:/Users/lisc/Documents/examples/ar/android-opencv-library/src/main/jni/Android.mk:OpenCV: non-system libraries in linker flags: -lopencv_java3
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
Android NDK: WARNING:/Users/lisc/Documents/examples/ar/android-opencv-library/src/main/jni/Android.mk:OpenCV: non-system libraries in linker flags: -lopencv_java3
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
[armeabi] Install : libOpenCV.so => libs/armeabi/libOpenCV.so
[armeabi-v7a] Install : libOpenCV.so => libs/armeabi-v7a/libOpenCV.so
BUILD SUCCESSFUL
Total time: 0.628 secs
下午1:42:38: External task execution finished 'ndkBuild'.
以下是灰度处理后的效果:
以上全部代码可以在此处下载
http://download.csdn.net/detail/ha000/9561823
相关文章推荐
- python中使用OpenCV进行人脸检测的例子
- opencv 做人脸识别 opencv 人脸匹配分析
- 使用opencv拉伸图像扩大分辨率示例
- Android Studio中配置OpenCV库开发环境的教程
- 基于C++实现kinect+opencv 获取深度及彩色数据
- visual studio 2012安装配置方法图文教程 附opencv配置教程
- OpenCV 2.4.3 C++ 平滑处理分析
- Python中使用OpenCV库来进行简单的气象学遥感影像计算
- 利用Python和OpenCV库将URL转换为OpenCV格式的方法
- python结合opencv实现人脸检测与跟踪
- Python环境搭建之OpenCV的步骤方法
- Python+Opencv识别两张相似图片
- Python实现OpenCV的安装与使用示例
- 在树莓派2或树莓派B+上安装Python和OpenCV的教程
- opencv-python学习一--人脸检测
- 在Ubuntu上安装OpenCV3.0和Python-openCV的经历
- 使用 Java 开发 OpenCV 应用
- OpenCV配置,从来没有这么简单!
- ubuntu下opencv和qt的安装配置
- visual studio 2012安装配置方法图文教程 附opencv配置教程