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