openCV人脸识别

1.下载编译好的SDK
2.解压后,新建项目,拷贝对应文件到项目中:
这里写图片描述
3.CmakeLists.txt修改如下:

cmake_minimum_required(VERSION 3.4.1)

include_directories(src/main/cpp/include)
file(GLOB my_source_path src/main/cpp/*.cpp src/main/cpp/*.c)
add_library(
             native-lib
             SHARED
             ${my_source_path} )

add_library(
            lib_opencv
            SHARED
            IMPORTED)
set_target_properties(
            lib_opencv
            PROPERTIES
            IMPORTED_LOCATION
            ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)


target_link_libraries(
                       native-lib
                       android
                       log
                       jnigraphics
                       lib_opencv
                       )

4.在cpp下新建native-lib.h

//
// Created by ygdx_lk on 17/11/20.
//

#ifndef IMAGEFACERECOGNITION_NATIVE_LIB_H
#define IMAGEFACERECOGNITION_NATIVE_LIB_H


#include <jni.h>
#include <string>
#include <android/log.h>
#include <android/bitmap.h>
#include <opencv2/opencv.hpp>
#include <android/native_window_jni.h>

#define LOG_TAG "native"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

extern "C"{

using namespace cv;
using namespace std;
CascadeClassifier *faceClassifier;
ANativeWindow *nativeWindow;

JNIEXPORT void JNICALL Java_com_study_imagefacerecognition_MainActivity_loadModel(JNIEnv *env, jobject instance, jstring detectMode_);

JNIEXPORT jboolean JNICALL Java_com_study_imagefacerecognition_MainActivity_process(JNIEnv *env, jobject instance, jobject bitmap);

JNIEXPORT void JNICALL Java_com_study_imagefacerecognition_MainActivity_setSurfaceview(JNIEnv *env, jobject instance, jobject surface, jint w, jint h);

JNIEXPORT void JNICALL Java_com_study_imagefacerecognition_MainActivity_destroy(JNIEnv *env, jobject instance);

void bitmap2Mat(JNIEnv *env, jobject bitmap, Mat &dst);
};

#endif //IMAGEFACERECOGNITION_NATIVE_LIB_H

5.native-lib.cpp

#include "native-lib.h"

void Java_com_study_imagefacerecognition_MainActivity_loadModel(JNIEnv *env, jobject instance, jstring detectMode_) {
    const char *detectMode = env->GetStringUTFChars(detectMode_, 0);

    //获取一个Classifier model
    faceClassifier = new CascadeClassifier(detectMode);

    env->ReleaseStringUTFChars(detectMode_, detectMode);
}

jboolean Java_com_study_imagefacerecognition_MainActivity_process(JNIEnv *env, jobject instance, jobject bitmap) {
    int ret = 1;
    Mat src;

    bitmap2Mat(env, bitmap, src);
    imwrite("/sdcard/d.png", src);
    if(faceClassifier){
        vector<Rect> faces;
        Mat grayMat;
        //图像灰度化
        cvtColor(src, grayMat, CV_BGR2GRAY);
        imwrite("/sdcard/huidu.png", grayMat);
        //直方图均衡化 增强对比效果
        equalizeHist(grayMat, grayMat);
        imwrite("/sdcard/e.png", grayMat);
        //识别,并将识别到的头部区域写入faces向量中
        faceClassifier->detectMultiScale(grayMat, faces);
        grayMat.release();
        for (int i = 0; i < faces.size(); ++i) {
            Rect face = faces[i];
            //Scalar(0, 255, 255) 参数含义:矩形的颜色
            rectangle(src, face.tl(), face.br(), Scalar(0, 255, 255));
        }
    }

    if(!nativeWindow){
        ret = 0;
//        goto end;
        src.release();

        return ret;
    }
    ANativeWindow_Buffer window_buffer;

    if(ANativeWindow_lock(nativeWindow, &window_buffer, 0)){
        ret = 0;
//        goto end;
        src.release();

        return ret;
    }
    imwrite("/sdcard/c.png", src);
    //绘制
    cvtColor(src, src, CV_BGR2RGBA);
    imwrite("/sdcard/b.png", src);
    int windowWidth = ANativeWindow_getWidth(nativeWindow);
    int windowHeight = ANativeWindow_getHeight(nativeWindow);
    LOGI("ROW:%d, STEP:%d  window_w:%d, window_h:%d", src.rows, (int)src.step, windowWidth, windowHeight);
//    resize(src, src, Size(window_buffer.width/2, window_buffer.height/2));
    // 缓冲区的地址/
    uint8_t *dst = (uint8_t *) window_buffer.bits;
    // 每行的内存大小
    int  dstStride = window_buffer.stride * 4;
    for (int i = 0; i < src.rows; ++i) {
        const Mat &row = src.row(i);
        uchar 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值