#include "faceDB.h" #include //"./out1.db" char *db_path = "out.db"; faceDB::faceDB() { // ´´½¨ÈËÁ³Êý¾Ý¿â¾ä±ú cv_verify_create_db(&handle_db); fprintf(stderr, "create cv_verify_create_db\n"); 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"); } 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); } if (top_scores[0] != 0) { indx=top_idxs[0]; } if (top_idxs) { delete[]top_idxs; } if (top_scores) { delete[]top_scores; } cv_verify_release_feature(p_feature); return indx; } 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"); } 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_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; }