AR技术之--基于opencv的人脸识别(三)

下面开始讲第一种方法,纯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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值