From 734e1a94bc026ba8e7e71de0a9ddabe12e07b13b Mon Sep 17 00:00:00 2001 From: pans <pans@454eff88-639b-444f-9e54-f578c98de674> Date: 星期三, 11 一月 2017 19:28:58 +0800 Subject: [PATCH] --- RtspFace/SensetimeFaceAPIWrapper/src/faceDB.h | 40 ++++++------- RtspFace/SensetimeFaceAPIWrapper/src/test.cpp | 24 ++++--- RtspFace/SensetimeFaceAPIWrapper/src/faceDB.cpp | 97 +++++++++++++++++++++----------- RtspFace/SensetimeFaceAPIWrapper/src/faceAPI.cpp | 5 - RtspFace/SensetimeFaceAPIWrapper/src/faceAPI.h | 8 +- 5 files changed, 103 insertions(+), 71 deletions(-) diff --git a/RtspFace/SensetimeFaceAPIWrapper/src/faceAPI.cpp b/RtspFace/SensetimeFaceAPIWrapper/src/faceAPI.cpp index d28dd6e..2c61cff 100644 --- a/RtspFace/SensetimeFaceAPIWrapper/src/faceAPI.cpp +++ b/RtspFace/SensetimeFaceAPIWrapper/src/faceAPI.cpp @@ -1,4 +1,4 @@ -锘�#include "FaceAPI.h" +锘�#include "faceAPI.h" #include <iostream> FaceDB *fdb; @@ -93,7 +93,6 @@ //faceDB瀹炵幇閮ㄥ垎 //"./out1.db" //char *db_path = "out.db"; - FaceDB::FaceDB() { @@ -149,7 +148,7 @@ 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); - return -1锛� + return -1; } cv_verify_release_feature(p_feature); return idx; diff --git a/RtspFace/SensetimeFaceAPIWrapper/src/faceAPI.h b/RtspFace/SensetimeFaceAPIWrapper/src/faceAPI.h index c115857..0dc2b60 100644 --- a/RtspFace/SensetimeFaceAPIWrapper/src/faceAPI.h +++ b/RtspFace/SensetimeFaceAPIWrapper/src/faceAPI.h @@ -36,10 +36,9 @@ class FaceDB { public: - FaceDB(); virtual ~FaceDB(); - + //人脸验证 cv_handle_t handle_verify; //数据库操作 @@ -51,7 +50,7 @@ bool init(char* db_path); //保存数据库 bool finally(); - + //搜索SDK数据库 int search_db(cv_feature_t* p_feature ); //添加记录 @@ -64,9 +63,10 @@ private: cv_result_t cv_result; char* db_path; - + //加载sdk数据库 bool db_load(); + bool db_save(); }; #endif diff --git a/RtspFace/SensetimeFaceAPIWrapper/src/faceDB.cpp b/RtspFace/SensetimeFaceAPIWrapper/src/faceDB.cpp index f57c356..62e2695 100644 --- a/RtspFace/SensetimeFaceAPIWrapper/src/faceDB.cpp +++ b/RtspFace/SensetimeFaceAPIWrapper/src/faceDB.cpp @@ -1,50 +1,73 @@ #include "faceDB.h" - -#include <iostream> - +//faceDB实现部分 //"./out1.db" -char *db_path = "out.db"; +//char *db_path = "out.db"; -faceDB::faceDB() +FaceDB::FaceDB() { - // 创建人脸数据库句柄 - cv_verify_create_db(&handle_db); - fprintf(stderr, "create cv_verify_create_db\n"); + +} + +FaceDB::~FaceDB() {} + +//初始化设置 +bool FaceDB::init(char* db_path_t) +{ + + db_path = db_path_t; + + //加载一次可多次使用。 cv_verify_create_handle(&handle_verify, "../models/verify.model"); fprintf(stderr, "create cv_verify_create_handle\n"); cv_face_create_detector(&handle_detect, NULL, CV_DETECT_ENABLE_ALIGN_21); fprintf(stderr, "create cv_face_create_detector\n"); - db_load(); - fprintf(stderr, "db load\n"); + + + // 创建人脸数据库句柄,在db_save()中,数据库保存成功,会释放该句柄 + cv_verify_create_db(&handle_db); + fprintf(stderr, "create cv_verify_create_db\n"); + + + if(db_load()) + { + fprintf(stderr, "db load\n"); + return true; + } + fprintf(stderr, "db load falied\n"); + return false; } -faceDB::~faceDB() {} - -/* -faceDB* faceDB::GetInstance(){ - if (db == NULL) +//调用数据库保存 +bool FaceDB::finally() +{ + if(db_save()) { - db = new faceDB(); + return true; } - - return db; -}*/ - -//数据库添加数据,并返回记录得id -int faceDB::db_add(cv_feature_t* p_feature) + + return false; + +} + +//@brief 数据库添加数据 +//@param 特征值 +//@return 人脸id,添加失败返回-1 +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); + return -1; } cv_verify_release_feature(p_feature); return idx; } -//数据库保存 -bool faceDB::db_save() +//@brief 保存数据库 +//@return 状态量 +bool FaceDB::db_save() { cv_result = cv_verify_save_db(handle_db, db_path); if (cv_result != CV_OK) { @@ -53,12 +76,13 @@ } else { fprintf(stderr, "save done!\n"); } - + cv_verify_destroy_db(handle_db); return true; } -//数据库加载 -bool faceDB::db_load() +//@brief 加载数据库 +//@return 状态量 +bool FaceDB::db_load() { if (handle_db != NULL) { fprintf(stderr, "handle_db is not null!%s\n",db_path); @@ -76,11 +100,11 @@ return true; } -//搜索数据库 -int faceDB::search_db(cv_feature_t *p_feature) +//@brief 搜索数据库 +//@param 人脸特征值 +//@return 人脸id +int FaceDB::search_db(cv_feature_t *p_feature) { - - int indx=-1; //查询前10条 int top_k = 3; @@ -102,8 +126,10 @@ } else { fprintf(stderr, "cv_verify_search_face failed, error code %d\n", cv_result); } + std::cout<<"this is hits"<<std::endl; if (top_scores[0] != 0) { indx=top_idxs[0]; + std::cout<<"indx="<<indx<<std::endl; } if (top_idxs) { delete[]top_idxs; @@ -112,19 +138,24 @@ delete[]top_scores; } cv_verify_release_feature(p_feature); + std::cout<<"return indx"<<std::endl; return indx; } -cv_feature_t* faceDB::extract_feature(cv::Mat image_color) +//@brief 提取特征值 +//@param 图片 +//@return 特征值 +cv_feature_t* FaceDB::extract_feature(cv::Mat image_color) { - if (handle_verify != NULL) { fprintf(stderr, "fdb.handle_verify is not null!\n"); } else { fprintf(stderr, "fdb.handle_verify is null!\n"); } + //该变量内存会在db_add()中,添加成功后释放。 cv_feature_t *p_feature = NULL; + cv_face_t *p_face = NULL; int face_count = 0; cv_result_t st_result = CV_OK; diff --git a/RtspFace/SensetimeFaceAPIWrapper/src/faceDB.h b/RtspFace/SensetimeFaceAPIWrapper/src/faceDB.h index c1aedda..6895c0c 100644 --- a/RtspFace/SensetimeFaceAPIWrapper/src/faceDB.h +++ b/RtspFace/SensetimeFaceAPIWrapper/src/faceDB.h @@ -1,44 +1,42 @@ #ifndef _FACEDB_H_ #define _FACEDB_H_ +#include <opencv2/opencv.hpp> #include <cv_face.h> #include "time_helper.h" -#include <opencv2/opencv.hpp> - -//人脸验证 -static cv_handle_t handle_verify; -//数据库操作 -static cv_handle_t handle_db; -//静态人脸识别 -static cv_handle_t handle_detect; - -class faceDB +class FaceDB { public: - //static faceDB* GetInstance(); + FaceDB(); + virtual ~FaceDB(); + + //人脸验证 + cv_handle_t handle_verify; + //数据库操作 + cv_handle_t handle_db; + //静态人脸识别 + cv_handle_t handle_detect; + + //初始化 + bool init(char* db_path); + //保存数据库 + bool finally(); //搜索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(); + //提取特征值 cv_feature_t *extract_feature(cv::Mat image_color); private: - cv_result_t cv_result; - //static faceDB* db; - //faceDB(const faceDB & ); + char* db_path; //加载sdk数据库 bool db_load(); + bool db_save(); }; - - #endif \ No newline at end of file diff --git a/RtspFace/SensetimeFaceAPIWrapper/src/test.cpp b/RtspFace/SensetimeFaceAPIWrapper/src/test.cpp index e71513b..3c804bb 100644 --- a/RtspFace/SensetimeFaceAPIWrapper/src/test.cpp +++ b/RtspFace/SensetimeFaceAPIWrapper/src/test.cpp @@ -2,7 +2,7 @@ #include <vector> #include <stdio.h> -#include "tools.h" +#include "faceAPI.h" using namespace std; @@ -15,7 +15,7 @@ char *image_list = "../test_image/imglist"; - person p={0,"axsdcc",1}; +// person p={0,"axsdcc",1}; cv::Mat bgr_image = cv::imread(image_path); if(bgr_image.data != NULL) { @@ -25,16 +25,20 @@ cout<<image_path<<endl; } - int idx = -11; - tools tool=tools(); - tool.init(); - cout<<"======tools init ==========="<<endl; + FaceDB db =FaceDB(); + db.init(db_path); + int id = db.search_db(db.extract_feature(bgr_image)); +// int idx = -11; +// tools tool=tools(); +// tool.init(); +// cout<<"======tools init ==========="<<endl; //idx=tool.reg(bgr_image,&p); - tool.search(bgr_image,&p); +// tool.search(bgr_image,&p); + cout<<"id="<<id<<endl; cout<<"============================================"<<endl; - cout<<"p_id="<<p.p_id<<endl; - cout<<"name="<<p.name<<endl; - cout<<"f_id="<<p.f_id<<endl; +// cout<<"p_id="<<p.p_id<<endl; +// cout<<"name="<<p.name<<endl; +// cout<<"f_id="<<p.f_id<<endl; return 0; -- Gitblit v1.8.0