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