#include "faceDB.h" //faceDBʵÏÖ²¿·Ö //"./out1.db" //char *db_path = "out.db"; FaceDB::FaceDB() { } 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_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; } //µ÷ÓÃÊý¾Ý¿â±£´æ bool FaceDB::finally() { if(db_save()) { return true; } 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; } //@brief ±£´æÊý¾Ý¿â //@return ״̬Á¿ 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"); } cv_verify_destroy_db(handle_db); return true; } //@brief ¼ÓÔØÊý¾Ý¿â //@return ״̬Á¿ 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; } //@brief ËÑË÷Êý¾Ý¿â //@param ÈËÁ³ÌØÕ÷Öµ //@return ÈËÁ³id 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); } std::cout<<"this is hits"<= 1) { st_result = cv_verify_get_feature(handle_verify, (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; }