RtspFace/SensetimeFaceAPIWrapper/src/faceAPI.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
RtspFace/SensetimeFaceAPIWrapper/src/faceAPI.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
RtspFace/SensetimeFaceAPIWrapper/src/faceDB.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
RtspFace/SensetimeFaceAPIWrapper/src/faceDB.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
RtspFace/SensetimeFaceAPIWrapper/src/test.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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; 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 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; 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 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;