From d54c54ed64f3766aaa4584fd7d317fcc98812bc4 Mon Sep 17 00:00:00 2001 From: pans <pans@454eff88-639b-444f-9e54-f578c98de674> Date: 星期二, 27 十二月 2016 15:33:33 +0800 Subject: [PATCH] --- /dev/null | 442 ---------------------------------- RtspFace/demo/faceAPI.cpp | 104 ++++++++ RtspFace/demo/faceDB.cpp | 109 ++++++++ RtspFace/demo/test.cpp | 22 + RtspFace/demo/faceDB.h | 36 ++ RtspFace/demo/faceAPI.h | 39 +++ 6 files changed, 310 insertions(+), 442 deletions(-) diff --git a/RtspFace/demo/demo.0.1.cpp b/RtspFace/demo/demo.0.1.cpp deleted file mode 100644 index eb7f34f..0000000 --- a/RtspFace/demo/demo.0.1.cpp +++ /dev/null @@ -1,256 +0,0 @@ -#include <iostream> -#include <vector> -#include <stdio.h> -#include <cv_face.h> -#include "time_helper.h" - -#include <opencv2/opencv.hpp> -#define DEFAULT_THRESHOLD (0.5) - -using namespace std; -using namespace cv; - -//人脸验证 -static cv_handle_t handle_verify = NULL; -//数据库操作 -static cv_handle_t handle_db = NULL; -//静态人脸识别 -static cv_handle_t handle_detect = NULL; - -#define _MAX_PATH 260 - -//提取图片特征值 -cv_feature_t *extract_feature(Mat image_color) { - - Mat image_color_color; - // cvtColor(image_color, image_color_color, CV_BGR2BGRA); // CV_PIX_FMT_BGRA8888 - image_color_color = image_color; // CV_PIX_FMT_BGR888 - - cv_feature_t *p_feature = NULL; - cv_face_t *p_face = NULL; - int face_count = 0; - cv_result_t st_result = CV_OK; - //检测人脸 - st_result = cv_face_detect(handle_detect, image_color_color.data, CV_PIX_FMT_BGR888, - image_color_color.cols, image_color_color.rows, image_color_color.step, - CV_FACE_UP, &p_face, &face_count); - if (face_count >= 1) { - //获取人脸特征 - st_result = cv_verify_get_feature(handle_verify, - (unsigned char *)image_color_color.data, CV_PIX_FMT_BGR888, - image_color_color.cols, image_color_color.rows, image_color_color.step, - p_face, &p_feature, NULL); - if (st_result != CV_OK) { - fprintf(stderr, "cv_verify_get_feature failed, error code %d\n", st_result); - } - } else { - fprintf(stderr, "can't find face in "); - } - // 释放内存 - cv_face_release_detector_result(p_face, face_count); - return p_feature; -} - -//数据库添加数据,并返回记录得id -int db_add(cv_feature_t *p_feature) { - /*cv_feature_t *p_feature = extract_feature(image_color); - if (!p_feature) { - return -1; - }*/ - int idx; - cv_result_t cv_result = cv_verify_add_face(handle_db, p_feature, &idx); - if (cv_result != CV_OK) { - fprintf(stderr, "cv_verify_add_face failed, error code %d\n", cv_result); - } - cv_verify_release_feature(p_feature); - return idx; -} - -//根据id删除记录 -bool db_del(int idx) { - if (idx < 0) { - fprintf(stderr, "invalid idx!\n"); - return false; - } - cv_result_t cv_result = CV_OK; - cv_result = cv_verify_delete_face(handle_db, idx); - if (cv_result != CV_OK) { - fprintf(stderr, "cv_verify_delete_face failed, error code %d\n", cv_result); - } else { - fprintf(stderr, "delete succeed\n"); - } -} - -//数据库保存 -bool db_save(char *db_path) { - cv_result_t cv_result = CV_OK; - cv_result = cv_verify_save_db(handle_db, db_path); - if (cv_result != CV_OK) { - fprintf(stderr, "cv_verify_save_db failed, error code %d\n", cv_result); - return false; - } else { - fprintf(stderr, "save done!\n"); - } - - return true; -} - -//数据库加载 -bool db_load(char *db_path) { - cv_result_t cv_result = CV_OK; - cv_result = cv_verify_load_db(handle_db, db_path); - - if (cv_result != CV_OK) { - fprintf(stderr, "cv_verify_load_db failed, error code %d\n", cv_result); - return false; - } else { - fprintf(stderr, "load done!\n"); - } - - return true; -} - -//搜索数据库 -bool search_db(Mat image_color,char *db_path) { - - cv_feature_t *p_feature = extract_feature(image_color); - if (p_feature == NULL) { - fprintf(stderr, "extract failed !\n"); - return false; - } - db_load(db_path); - //查询前10条 - int top_k = 10; - int *top_idxs = new int[top_k]; - float *top_scores = new float[top_k]; - unsigned int result_length = 0; - cv_result_t cv_result = cv_verify_search_face(handle_verify, handle_db, - p_feature, top_k, - top_idxs, top_scores, &result_length); - if (cv_result == CV_OK) { - //输出检查结果 - for (unsigned int t = 0; t < result_length; t++) { - // const cv_feature_t item = result[t].item; - fprintf(stderr, "%d\t", top_idxs[t]); - fprintf(stderr, "%0.2f\n", top_scores[t]); - } - } else { - fprintf(stderr, "cv_verify_search_face failed, error code %d\n", cv_result); - } - if (top_idxs) { - delete[]top_idxs; - } - if (top_scores) { - delete[]top_scores; - } - cv_verify_release_feature(p_feature); - return true; -} - -//批量导入图片进行分析 -bool db_gen(char *image_list, char *db_path) { - bool bresult = true; - //读取图片列表 - FILE *fp_path = fopen(image_list, "r"); - if(!fp_path) { - fprintf(stderr, "failed to load %s\n", image_list); - return false; - } - - //人脸特征信息 数据结构 - std::vector<cv_feature_t *> list_feature; - list_feature.clear(); - - for (;;) { - char image_path[1024]; - int num = fscanf(fp_path, "%s", image_path); - if (num != 1) { - bresult = false; - break; - } - fprintf(stderr, "extracting %s\n", image_path); - - - // get the face feature - Mat image_color = imread(image_path); - if (!image_color.data) { - return NULL; - } - - cv_feature_t *p_feature = extract_feature(image_color); - if (!p_feature) { - fprintf(stderr, "failed to extract image: %s\n", image_path); - continue; - } - list_feature.push_back(p_feature); - } - fclose(fp_path); - - - cv_verify_destroy_db(handle_db); - cv_result_t cv_result = CV_OK; - cv_verify_create_db(&handle_db); - //创建新的数据库,应该改为判断,如果数据库存在则进行插入,否则新建。 - if(db_load(db_path)){ - for (int x = 0; x < list_feature.size(); x++) { - db_add(list_feature[x]); - } - }else{ - cv_result = cv_verify_build_db(handle_db, &list_feature[0], list_feature.size()); - if (cv_result != CV_OK) { - fprintf(stderr, "cv_verify_build_db failed, error code %d\n", cv_result); - bresult = false; - } - for (int i = 0; i < list_feature.size(); i++) { - cv_verify_release_feature(list_feature[i]); - } - } - cv_verify_save_db(handle_db, db_path); - - - return bresult; -} - -int main(int argc, char *argv[]) { - - //文件路径 - char *db_path = "./out1.db"; - char *image_path = "../../test_image/face_08.jpg"; - char *image_list = "../../test_image/imglist"; - - //创建静态人脸识别句柄,同时创建状态标量 - cv_result_t cv_result = cv_face_create_detector(&handle_detect, NULL, CV_DETECT_ENABLE_ALIGN_21); - if (cv_result != CV_OK){ - fprintf(stderr, "create detect handle failed, error code %d\n", cv_result); - } - //创建人脸验证句柄并初始化 - cv_result = cv_verify_create_handle(&handle_verify, "../../../models/verify.model"); - if (cv_result != CV_OK){ - fprintf(stderr, "create verify handle failed, error code %d\n", cv_result); - } - // 创建人脸数据库句柄 - cv_result = cv_verify_create_db(&handle_db); - if (cv_result != CV_OK){ - fprintf(stderr, "create db handle failed, error code %d\n", cv_result); - } - - //批量插入数据库 - db_gen(image_list,db_path); - - //待搜索的图像 - Mat image_color = imread(image_path); - if (!image_color.data) { - return NULL; - } - //搜索数据库 - if(search_db(image_color,db_path)){ - cout<<"search db"<<endl; - } - - //回收内存 - cv_face_destroy_detector(handle_detect); - cv_verify_destroy_db(handle_db); - cv_verify_destroy_handle(handle_verify); - return 0; -} - diff --git a/RtspFace/demo/demo.x.cpp b/RtspFace/demo/demo.x.cpp deleted file mode 100644 index 1839ebd..0000000 --- a/RtspFace/demo/demo.x.cpp +++ /dev/null @@ -1,442 +0,0 @@ -#include <stdio.h> -#include <iostream> -#include <opencv2/opencv.hpp> -#include "time_helper.h" -#include "cv_face.h" -#include <windows.h> - -#define DEFAULT_THRESHOLD (0.5) -using namespace std; -using namespace cv; - -// @获取人脸特征值 -// @param bgr_image 需要提取特征值的图片 -// @param handle_verify 已经初始化的人脸验证句柄 -cv_feature_t * getFeature(Mat bgr_image,cv_handle_t handle_verify) { - - cv_feature_t *p_feature = NULL; - Mat image_color; - image_color = bgr_image; - - //调用句柄。用于保存函数及数据的句柄 - cv_handle_t handle_detect = NULL; - - //人脸信息结构体 - cv_face_t *p_face = NULL; - - int face_count = 0; - - //函数返回的错误代码类型 - cv_result_t cv_result = CV_OK; - char *string_feature; - do - { - // 创建静态图片人脸检测句柄 - cv_result = cv_face_create_detector(&handle_detect, NULL, CV_DETECT_ENABLE_ALIGN_21); - if (cv_result != CV_OK) { - fprintf(stderr, "fail to init detect handle, error code %d\n", cv_result); - break; - } - - // 人脸检测1.成功返回CV_OK,否则返回错误类型 - cv_result = cv_face_detect(handle_detect, image_color.data, CV_PIX_FMT_BGR888, - image_color.cols, image_color.rows, image_color.step, - CV_FACE_UP, &p_face, &face_count); - if (cv_result != CV_OK) { - fprintf(stderr, "cv_face_detect failed, error code : %d\n", cv_result); - break; - } - - if (face_count > 0) { - //用于表示人脸特征信息 - float score; - unsigned int feature_length = 0; - - // get feature - __TIC__(); - //提取人脸特征1,可以把返回数组编码成字符串后存储起来以便以后使用 - cv_result = cv_verify_get_feature(handle_verify, image_color.data, CV_PIX_FMT_BGR888, - image_color.cols, image_color.rows, image_color.step, p_face, - &p_feature, &feature_length); - __TOC__(); - if (cv_result != CV_OK) { - fprintf(stderr, "cv_verify_get_feature failed, error code %d\n", cv_result); - break; - } - - if (feature_length > 0 ) { - - // test serial and deserial - string_feature = new char[CV_ENCODE_FEATURE_SIZE(p_feature)]; - cv_verify_serialize_feature(p_feature, string_feature); - - //释放提取人脸特征时分配的空间 - cv_verify_release_feature(p_feature); - break; - } else { - fprintf(stderr, "error, the feature length is 0!\n"); - } - // 释放提取人脸特征时分配的空间 - cv_verify_release_feature(p_feature); - - } else { - if (face_count == 0) { - fprintf(stderr, "can't find face in \n"); - } - } - } while (0); - cv_face_release_detector_result(p_face, face_count); - return string_feature; -} - - -//测试确定人脸位置 -int testface_detect(Mat bgr_image_color,char* output_image_path ){ - - int points_size = 106; - int config; - if (points_size == 21) { - config = CV_DETECT_ENABLE_ALIGN_21; - } - else if (points_size == 106) { - config = CV_DETECT_ENABLE_ALIGN_106; - } - else { - fprintf(stderr, "alignment point size error, must be 21 or 106\n"); - return -1; - } - - // load image - Mat image_color; - - - // cvtColor(bgr_image_color, image_color, CV_BGR2BGRA); // CV_PIX_FMT_BGRA8888 - image_color = bgr_image_color; // CV_PIX_FMT_BGR888 - - // init detect handle - cv_handle_t handle_detect = NULL; - cv_result_t cv_result = CV_OK; - cv_face_t* p_face = NULL; - int face_count = 0; - do - { - cv_result = cv_face_create_detector(&handle_detect, NULL, config); - if (cv_result != CV_OK) { - fprintf(stderr, "cv_face_create_detector failed, error code %d\n", cv_result); - break; - } - - /* - * test get and set threshold - */ - float default_threshold; - cv_result = cv_face_detect_get_threshold(handle_detect, &default_threshold); - if (cv_result != CV_OK) { - fprintf(stderr, "cv_face_detect_get_threshold failed, error code %d\n", cv_result); - break; - } - fprintf(stderr, "default threshold : %f\n", default_threshold); - - cv_result = cv_face_detect_set_threshold(handle_detect, default_threshold); - if (cv_result != CV_OK) { - fprintf(stderr, "cv_face_detect_set_threshold failed, error code %d\n", cv_result); - break; - } - fprintf(stderr, "threshold set : %f\n", default_threshold); - - - // detect - __TIC__(); - cv_result = cv_face_detect(handle_detect, image_color.data, CV_PIX_FMT_BGR888, - image_color.cols, image_color.rows, image_color.step, - CV_FACE_UP, &p_face, &face_count); - __TOC__(); - if (cv_result != CV_OK) { - fprintf(stderr, "cv_face_detect error %d\n", cv_result); - break; - } - - if (face_count > 0) { - // draw result - for (int i = 0; i < face_count; i++) { - rectangle(image_color, Point(p_face[i].rect.left, p_face[i].rect.top), - Point(p_face[i].rect.right, p_face[i].rect.bottom), - Scalar(0, 255, 0), 2, 8, 0); - fprintf(stderr, "face number: %d\n", i + 1); - fprintf(stderr, "face rect: [%d, %d, %d, %d]\n", p_face[i].rect.top, - p_face[i].rect.left, - p_face[i].rect.right, p_face[i].rect.bottom); - fprintf(stderr, "score: %f\n", p_face[i].score); - fprintf(stderr, "face pose: [yaw: %f, pitch: %f, roll: %f, eye distance: %f]\n", - p_face[i].yaw, - p_face[i].pitch, p_face[i].roll, p_face[i].eye_dist); - fprintf(stderr, "face algin:\n"); - for (unsigned int j = 0; j < p_face[i].points_count; j++) { - float x = p_face[i].points_array[j].x; - float y = p_face[i].points_array[j].y; - fprintf(stderr, "(%.2f, %.2f)\n", x, y); - circle(image_color, Point2f(x, y), 2, Scalar(0, 0, 255), -1); - } - fprintf(stderr, "\n"); - } - // save image - imwrite(output_image_path, image_color); - } - else { - fprintf(stderr, "can't find face in "); - } - - } while (0); - - - // release the memory of face - cv_face_release_detector_result(p_face, face_count); - // destroy detect handle - cv_face_destroy_detector(handle_detect); - - - fprintf(stderr, "test finish!\n"); - return 0; -} - -// @brief 测试人脸对比 -// @param bgr_image_1 图像1 -// @param bgr_image_1 图像2 -int testface_verify(Mat bgr_image_1,Mat bgr_image_2){ - - // 保存两个图片的原始数据 - Mat image_color_1,image_color_2; - // cvtColor(bgr_image_1, image_color_color_1, CV_BGR2BGRA); // CV_PIX_FMT_BGRA8888 - image_color_1 = bgr_image_1; // CV_PIX_FMT_BGR888 - // cvtColor(bgr_image_2, image_color_2, CV_BGR2BGRA); - image_color_2 = bgr_image_2; - - int main_return = -1; - - //调用句柄。用于保存函数及数据的句柄 - cv_handle_t handle_detect = NULL; - cv_handle_t handle_verify = NULL; - - //人脸信息结构体 - cv_face_t *p_face_1 = NULL; - cv_face_t *p_face_2 = NULL; - - int face_count_1 = 0; - int face_count_2 = 0; - - //函数返回的错误代码类型 - cv_result_t cv_result = CV_OK; - - do { - cout<<"a"<<endl; - // 创建静态图片人脸检测句柄 - cv_result = cv_face_create_detector(&handle_detect, NULL, CV_DETECT_ENABLE_ALIGN_21); - - if (cv_result != CV_OK) { - fprintf(stderr, "fail to init detect handle, error code %d\n", cv_result); - break; - } - - // 人脸检测1.成功返回CV_OK,否则返回错误类型 - cv_result = cv_face_detect(handle_detect, image_color_1.data, CV_PIX_FMT_BGR888, - image_color_1.cols, image_color_1.rows, image_color_1.step, - CV_FACE_UP, &p_face_1, &face_count_1); - if (cv_result != CV_OK) { - fprintf(stderr, "cv_face_detect failed, error code : %d\n", cv_result); - break; - } - - // 人脸检测2.成功返回CV_OK,否则返回错误类型 - cv_result = cv_face_detect(handle_detect, image_color_2.data, CV_PIX_FMT_BGR888, - image_color_2.cols, image_color_2.rows, image_color_2.step, - CV_FACE_UP, &p_face_2, &face_count_2); - if (cv_result != CV_OK) { - fprintf(stderr, "cv_face_detect failed, error code : %d\n", cv_result); - break; - } - - // 人脸验证 - if (face_count_1 > 0 && face_count_2 > 0) { - // 创建人脸验证句柄 - cv_result = cv_verify_create_handle(&handle_verify, "../../../models/verify.model"); - if (cv_result != CV_OK) - { - fprintf(stderr, "fail to init verify handle, error code %d\n", cv_result); - break; - } - - if (handle_verify) { - int model_version = cv_verify_get_version(handle_verify); - fprintf(stderr, "verify model version : %d\n", model_version); - int feature_length = cv_verify_get_feature_length(handle_verify); - fprintf(stderr, "verify model feature length : %d\n", feature_length); - - //用于表示人脸特征信息 - cv_feature_t *p_feature_1 = NULL, *p_feature_2 = NULL; - float score; - unsigned int feature_length_1 = 0, feature_length_2 = 0; - - // get feature - __TIC__(); - //提取人脸特征1,可以把返回数组编码成字符串后存储起来以便以后使用 - cv_result = cv_verify_get_feature(handle_verify, image_color_1.data, CV_PIX_FMT_BGR888, - image_color_1.cols, image_color_1.rows, image_color_1.step, p_face_1, - &p_feature_1, &feature_length_1); - __TOC__(); - if (cv_result != CV_OK) { - fprintf(stderr, "cv_verify_get_feature failed, error code %d\n", cv_result); - break; - } - //提取人脸特征1,可以把返回数组编码成字符串后存储起来以便以后使用 - cv_result = cv_verify_get_feature(handle_verify, image_color_2.data, CV_PIX_FMT_BGR888, - image_color_2.cols, image_color_2.rows, image_color_2.step, p_face_2, - &p_feature_2, &feature_length_2); - if (cv_result != CV_OK) { - fprintf(stderr, "cv_verify_get_feature failed, error code %d\n", cv_result); - break; - } - - if (feature_length_1 > 0 && feature_length_2 > 0) { - cv_feature_header_t *p_feature_header = CV_FEATURE_HEADER(p_feature_1); - fprintf(stderr, "Feature information:\n"); - fprintf(stderr, " ver:\t0x%08x\n", p_feature_header->ver); - fprintf(stderr, " length:\t%d bytes\n", p_feature_header->len); - - // 人脸验证 - cv_result = cv_verify_compare_feature(handle_verify, p_feature_1, - p_feature_2, &score); - if (cv_result == CV_OK) { - fprintf(stderr, "score: %f\n", score); - // comapre score with DEFAULT_THRESHOLD - // > DEFAULT_THRESHOLD => the same person - // < DEFAULT_THRESHOLD => different people - if (score > DEFAULT_THRESHOLD) - fprintf(stderr, "the same person.\n"); - else - fprintf(stderr, "different people.\n"); - - main_return = 0; // success - } - else { - fprintf(stderr, "cv_verify_compare_feature failed, error code : %d\n", cv_result); - } - - // test serial and deserial - char *string_feature_1 = new char[CV_ENCODE_FEATURE_SIZE(p_feature_1)]; - cv_verify_serialize_feature(p_feature_1, string_feature_1); - cout<<string_feature_1<<endl; - cv_feature_t *p_feature_new_1 = cv_verify_deserialize_feature(string_feature_1); - delete[]string_feature_1; - char *string_feature_2; - string_feature_2 = new char[CV_ENCODE_FEATURE_SIZE(p_feature_2)]; - cv_verify_serialize_feature(p_feature_2, string_feature_2); - cout<<string_feature_2<<endl; - cv_feature_t *p_feature_new_2 = cv_verify_deserialize_feature(string_feature_2); - delete[]string_feature_2; - - score = 0.0; - cv_result = cv_verify_compare_feature(handle_verify, p_feature_1, - p_feature_2, &score); - fprintf(stderr, "after serial and deserial the feature compare score is %f \n", score); - cin>>string_feature_2; - //释放提取人脸特征时分配的空间 - cv_verify_release_feature(p_feature_new_1); - cv_verify_release_feature(p_feature_new_2); - } - else { - fprintf(stderr, "error, the feature length is 0!\n"); - } - // 释放提取人脸特征时分配的空间 - cv_verify_release_feature(p_feature_1); - cv_verify_release_feature(p_feature_2); - - } - } - else { - if (face_count_1 == 0) { - fprintf(stderr, "can't find face in \n"); - } - if (face_count_2 == 0) { - fprintf(stderr, "can't find face in \n"); - } - } - } while (0); - - - // release the memory of face - cv_face_release_detector_result(p_face_1, face_count_1); - cv_face_release_detector_result(p_face_2, face_count_2); - // destroy detect handle - cv_face_destroy_detector(handle_detect); - // destroy verify handle - cv_verify_destroy_handle(handle_verify); - fprintf(stderr, "test finish!\n"); - return 0; -} - -int main() { - - //图片入口,现需经过OPENCV处理后被sdk使用。 - char* input_image_path = "../../test_image/face_06.jpg"; - char* output_image_path = "../../test_image/face_06out.jpg"; - - // 创建人脸验证句柄并初始化 - //函数返回的错误代码类型 - cv_result_t cv_result = CV_OK; - cv_handle_t handle_verify =NULL; - cv_result = cv_verify_create_handle(&handle_verify, "../../../models/verify.model"); - if (cv_result != CV_OK) - { - fprintf(stderr, "fail to init verify handle, error code %d\n", cv_result); - - } - - - //-------测试人脸 识别位置 start------- - Mat bgr_image_1 = imread(input_image_path); - if (!bgr_image_1.data) { - fprintf(stderr, "fail to read %s\n", input_image_path); - return -1; - }else - { - testface_detect(bgr_image_1,output_image_path); - } - //-------测试人脸 识别位置 end------- -/* - //-------测试人脸 验证 start------- - output_image_path = "../../test_image/face_04.jpg"; - Mat bgr_image_2 = imread(output_image_path); - if (!bgr_image_2.data) { - fprintf(stderr, "fail to read %s\n", output_image_path); - return -1; - }else - { - testface_verify(bgr_image_color,bgr_image_2); - } - //-------测试人脸 验证 end------- - - - //-------测试提取人脸特征值 start------- - Mat bgr_image_1 = imread(input_image_path); - char *string_feature; - - if (!bgr_image_1.data) { - fprintf(stderr, "fail to read %s\n", input_image_path); - return -1; - }else - { - string_feature=getFeature(bgr_image_1,handle_verify); - } - cout<<string_feature<<endl; - //-------测试提取人脸特征值 end------- -*/ - // - - - - - cin>>cv_result; - Sleep(100); - return 0; -} - diff --git a/RtspFace/demo/faceAPI.cpp b/RtspFace/demo/faceAPI.cpp new file mode 100644 index 0000000..128c124 --- /dev/null +++ b/RtspFace/demo/faceAPI.cpp @@ -0,0 +1,104 @@ +#include "faceAPI.h" +#include "faceDB.h" + +faceDB fdb = faceDB::faceDB(); +faceAPI::faceAPI(){ + //创建静态人脸识别句柄,同时创建状态标量 + cv_result_t cv_result = 0; + cv_face_create_detector(&handle_detect, NULL, CV_DETECT_ENABLE_ALIGN_21); + cv_verify_create_handle(&handle_verify1, "verify.model"); + //faceDB* f_db = faceDB.GetInstance(); +} + +faceAPI::~faceAPI(){ + +} + +int faceAPI::do_reasch(cv::Mat image){ + if (!image.data) { + fprintf(stderr, "fail to read img\n"); + return -1; + }else + fprintf(stderr, "read img\n"); + p_f = extract_feature(image); + if (!p_f) + { + fprintf(stderr, "p_f is null\n"); + return -2; + } + return p_img_search(p_f); +} + +int faceAPI::do_reasch(char* s_feature){ + get_feature(s_feature,p_f); + return p_img_search(p_f); +} + +int faceAPI::do_register(cv::Mat image){ + p_f = extract_feature(image); + //db add + int indx = 1; + return indx; +} + + +int faceAPI::p_img_search(cv_feature_t *p_feature){ + std::cout<<"p img search"<<std::endl; + + return fdb.search_db(p_feature); +} + +cv_feature_t* faceAPI::extract_feature(const cv::Mat image_color) { + + if (handle_verify1 != NULL) + { + fprintf(stderr, "handle_verify1 is not null!\n"); + } + else + { + fprintf(stderr, "handle_verify1 is null!\n"); + } + + cv_feature_t *p_feature = NULL; + cv_face_t *p_face = NULL; + int face_count = 0; + cv_result_t st_result = CV_OK; + st_result = cv_face_detect(handle_detect, image_color.data, CV_PIX_FMT_BGR888, + image_color.cols, image_color.rows, image_color.step, + CV_FACE_UP, &p_face, &face_count); + if (face_count >= 1) { + st_result = cv_verify_get_feature(handle_verify1, + (unsigned char *)image_color.data, CV_PIX_FMT_BGR888, + image_color.cols, image_color.rows, image_color.step, + p_face, &p_feature, NULL); + if (st_result != CV_OK) { + fprintf(stderr, "cv_verify_get_feature failed, error code %d\n", st_result); + } + } else { + fprintf(stderr, "can't find face in "); + } + // release the memory of face + cv_face_release_detector_result(p_face, face_count); + return p_feature; +} + + +//@brief 特征值转换为字符串 +//@param 特征值 +//@return 字符串格式的特征值 +int faceAPI::get_char(cv_feature_t *p_feature,char* feature_str){ + + return cv_verify_serialize_feature(p_feature,feature_str); +} + +//@brief 字符串转换为特征值 +//@param 字符串格式的特征值 +//@return 特征值 +int faceAPI::get_feature(char *feature_str,cv_feature_t *p_feature){ + + p_feature = cv_verify_deserialize_feature(feature_str); + if(p_feature != NULL){ + return 0; + }else + return -1; +} \ No newline at end of file diff --git a/RtspFace/demo/faceAPI.h b/RtspFace/demo/faceAPI.h new file mode 100644 index 0000000..fe7a5b4 --- /dev/null +++ b/RtspFace/demo/faceAPI.h @@ -0,0 +1,39 @@ +#ifndef _FACEAPI_H_ +#define _FACEAPI_H_ + +#include <opencv2/opencv.hpp> +#include <cv_face.h> +#include "time_helper.h" + +//静态人脸识别 +static cv_handle_t handle_detect = NULL; +//人脸验证 +static cv_handle_t handle_verify1 = NULL; + +class faceAPI +{ +public: + faceAPI(); + ~faceAPI(); + //查询 前台调用 + int do_reasch(char* s_feature); + int do_reasch(cv::Mat image); + //注册 后台另一进程调用 + int do_register(cv::Mat image); + +private: + + //调用搜索 + int p_img_search(cv_feature_t *p_feature); + + //提取特征值 + cv_feature_t *extract_feature(cv::Mat image_color); + + //转换函数 + int get_char(cv_feature_t *p_feature,char* feature_str); + int get_feature(char *feature_str,cv_feature_t *p_feature); + + cv_feature_t* p_f; +}; + +#endif diff --git a/RtspFace/demo/faceDB.cpp b/RtspFace/demo/faceDB.cpp new file mode 100644 index 0000000..16f5575 --- /dev/null +++ b/RtspFace/demo/faceDB.cpp @@ -0,0 +1,109 @@ +#include "faceDB.h" + +#include <iostream> + +//"./out1.db" +char *db_path = "out.db"; + +faceDB::faceDB(){ + // 创建人脸数据库句柄 + cv_verify_create_db(&handle_db); + cv_verify_create_handle(&handle_verify, "verify.model"); + db_load(); +} + +faceDB::~faceDB(){} + +/* +faceDB* faceDB::GetInstance(){ + if (db == NULL) + { + db = new faceDB(); + } + + return db; +}*/ + +//数据库添加数据,并返回记录得id +int faceDB::db_add(cv_feature_t* p_feature) { + int idx; + cv_result_t cv_result = cv_verify_add_face(handle_db, p_feature, &idx); + if (cv_result != CV_OK) { + fprintf(stderr, "cv_verify_add_face failed, error code %d\n", cv_result); + } + cv_verify_release_feature(p_feature); + return idx; +} + + +//数据库保存 +bool faceDB::db_save() { + cv_result = cv_verify_save_db(handle_db, db_path); + if (cv_result != CV_OK) { + fprintf(stderr, "cv_verify_save_db failed, error code %d\n", cv_result); + return false; + } + else { + fprintf(stderr, "save done!\n"); + } + + return true; +} + +//数据库加载 +bool faceDB::db_load() { + if (handle_db != NULL) + { + fprintf(stderr, "handle_db is not null!%s\n",db_path); + } + else + { + fprintf(stderr, "handle_db is null!%s\n",db_path); + } + cv_result = cv_verify_load_db(handle_db, db_path); + if (cv_result != CV_OK) { + fprintf(stderr, "cv_verify_load_db failed, error code %d\n", cv_result); + return false; + } + else { + fprintf(stderr, "load done!\n"); + } + + return true; +} + +//搜索数据库 +int faceDB::search_db(cv_feature_t *p_feature) { + + + int indx=-1; + //查询前10条 + int top_k = 3; + int *top_idxs = new int[top_k]; + float *top_scores = new float[top_k]; + unsigned int result_length = 0; + cv_result = cv_verify_search_face(handle_verify, handle_db, + p_feature, top_k, + top_idxs, top_scores, &result_length); + + + if (cv_result == CV_OK) { + //输出检查结果 + for (unsigned int t = 0; t < result_length; t++) { + // const cv_feature_t item = result[t].item; + fprintf(stderr, "%d\t", top_idxs[t]); + fprintf(stderr, "%0.2f\n", top_scores[t]); + } + } else { + fprintf(stderr, "cv_verify_search_face failed, error code %d\n", cv_result); + } + indx=top_idxs[0]; + if (top_idxs) { + delete[]top_idxs; + } + if (top_scores) { + delete[]top_scores; + } + cv_verify_release_feature(p_feature); + return indx; +} \ No newline at end of file diff --git a/RtspFace/demo/faceDB.h b/RtspFace/demo/faceDB.h new file mode 100644 index 0000000..5a5a1c6 --- /dev/null +++ b/RtspFace/demo/faceDB.h @@ -0,0 +1,36 @@ +#ifndef _FACEDB_H_ +#define _FACEDB_H_ + +#include <cv_face.h> +#include "time_helper.h" +//人脸验证 +static cv_handle_t handle_verify = NULL; +//数据库操作 +static cv_handle_t handle_db = NULL; + +class faceDB{ +public: + //static faceDB* GetInstance(); + + //搜索SDK数据库 + int search_db(cv_feature_t* p_feature ); + //添加记录 + int db_add(cv_feature_t* p_feature); + //保存数据库 + bool db_save(); + int set_dbpath(char* db_path); + + faceDB(); + virtual ~faceDB(); +private: + + cv_result_t cv_result; + //static faceDB* db; + //faceDB(const faceDB & ); + + //加载sdk数据库 + bool db_load(); +}; + + +#endif \ No newline at end of file diff --git a/RtspFace/demo/test.cpp b/RtspFace/demo/test.cpp new file mode 100644 index 0000000..35376e9 --- /dev/null +++ b/RtspFace/demo/test.cpp @@ -0,0 +1,22 @@ +#include <iostream> +#include <vector> +#include <stdio.h> + +#include "faceAPI.h" + +using namespace std; + +int main(int argc) { + + //文件路径 + char *db_path = "./out.db"; + char *image_path = "../../test_image/face_04.jpg"; + char *image_list = "../../test_image/imglist"; + cv::Mat bgr_image = cv::imread(image_path); + int idx = -11; + faceAPI face; + idx = face.do_reasch(bgr_image); + cout<<"idx="<<idx<<endl; + system("pause"); + return 0; +} \ No newline at end of file -- Gitblit v1.8.0