#include <jni.h>
#include
#include “opencv2/opencv.hpp”
#include “android/bitmap.h”
#include “android/log.h”
//使用命名空间
using namespace cv;
using namespace dnn;
/**
- 加载人脸识别的分类器文件
*/
CascadeClassifier cascadeClassifier;
extern “C”
JNIEXPORT void JNICALL
Java_com_hxg_ndkface_FaceDetection_loadCascade(JNIEnv *env, jobject instance, jstring file_path) {
const char *filePath = env->GetStringUTFChars(file_path, 0);
cascadeClassifier.load(filePath);
__android_log_print(ANDROID_LOG_INFO, “TTTTT”, “%s”, “分类器文件加载成功”);
env->ReleaseStringUTFChars(file_path, filePath);
}
- 只检测是否有人脸
/**
- 只检测是否有人脸
*/
extern “C”
JNIEXPORT jboolean JNICALL
Java_com_hxg_ndkface_FaceDetection_faceDetection(JNIEnv *env, jobject thiz, jobject bitmap) {
//检测人脸,opencv 有个关键类 是Mat open只会处理Mat android里面是Bitmap
//1.Bitmap转成opencv能操作的C++对象Mat
Mat mat;
bitmap2Mat(env, mat, bitmap);
//处理灰度图,提高效率
Mat gray_mat;
__android_log_print(ANDROID_LOG_INFO, “TTTTT”, “%s”, “处理灰度图”);
cvtColor(mat, gray_mat, COLOR_BGRA2GRAY);
__android_log_print(ANDROID_LOG_INFO, “TTTTT”, “%s”, “再次处理 直方均衡补偿”);
//再次处理 直方均衡补偿
Mat equalize_mat;
equalizeHist(gray_mat, equalize_mat);
//识别人脸,要加载人脸分类器文件
std::vector
cascadeClassifier.detectMultiScale(equalize_mat, faces, 1.1, 3, CV_HAAR_SCALE_IMAGE,
Size(30, 30));
__android_log_print(ANDROID_LOG_INFO, “TTTTT”, “人脸个数:%d”, faces.size());
if (faces.size() == 1) {
return true;
}
return false;
}
- 检测有无人脸,并保存到文件夹
/**
- 检测有无人脸,并保存到文件夹
*/
extern “C”
JNIEXPORT jint JNICALL
Java_com_hxg_ndkface_FaceDetection_faceDetectionSaveInfo(JNIEnv *env, jobject instance,
jstring name,
jobject bitmap) {
const char *filePath = env->GetStringUTFChars(name, 0);
//检测人脸,opencv 有个关键类 是Mat open只会处理Mat android里面是Bitmap
//1.Bitmap转成opencv能操作的C++对象Mat
Mat mat;
bitmap2Mat(env, mat, bitmap);
//处理灰度图,提高效率
Mat gray_mat;
cvtColor(mat, gray_mat, COLOR_BGRA2GRAY);
//再次处理 直方均衡补偿
Mat equalize_mat;
equalizeHist(gray_mat, equalize_mat);
//识别人脸,要加载人脸分类器文件
std::vector
cascadeClassifier.detectMultiScale(equalize_mat, faces, 1.1, 5, 0 | CV_HAAR_SCALE_IMAGE,
Size(160, 160));
__android_log_print(ANDROID_LOG_INFO, “TTTTT”, “人脸个数:%d”, faces.size());
if (faces.size() == 1) {
Rect faceRect = faces[0];
//在人脸部分画个图
rectangle(mat, faceRect, Scalar(255, 0, 0), 3);
__android_log_print(ANDROID_LOG_ERROR, “TTTTT”, “人脸个数:%s”, “在人脸部分画个图”);
//把mat我们又放到bitmap中
mat2Bitmap(env, mat, bitmap);
//保存人脸信息Mat,图片jpg
Mat saveMat = Mat(equalize_mat, faceRect);
//保存face_info_mat
imwrite(filePath, equalize_mat);
return 1;
}
env->ReleaseStringUTFChars(name, filePath);
return 0;
}
- 人脸对比
/**
*人脸对比
*/
extern “C”
JNIEXPORT jdouble JNICALL
Java_com_hxg_ndkface_FaceDetection_histogramMatch(JNIEnv *env, jobject instance, jobject bitmap1,
jobject bitmap2) {
//1.Bitmap转成opencv能操作的C++对象Mat
Mat mat, mat1;
bitmap2Mat(env, mat, bitmap1);
bitmap2Mat(env, mat1, bitmap2);
// 转灰度矩阵
cvtColor(mat, mat, COLOR_BGR2HSV);
cvtColor(mat1, mat1, COLOR_BGR2HSV);
int channels[] = {0, 1};
int histsize[] = {180, 255};
float r1[] = {0, 180};
float r2[] = {0, 255};
const float *ranges[] = {r1, r2};
Mat hist1, hist2;
calcHist(&mat, 3, channels, Mat(), hist1, 2, histsize, ranges, true);
//https://www.cnblogs.com/bjxqmy/p/12292421.html
normalize(hist1, hist1, 1, 0, NORM

3769

被折叠的 条评论
为什么被折叠?



