From 004e5b3424f02b2b413a52d7162594c4cc5c5547 Mon Sep 17 00:00:00 2001 From: houxiao <houxiao@454eff88-639b-444f-9e54-f578c98de674> Date: 星期三, 28 六月 2017 14:02:52 +0800 Subject: [PATCH] add compare bin proto --- FaceServer/STFaceCache.cpp | 21 ++++++++++ FaceServer/main_face_daemon.cpp | 11 ++--- FaceServer/face_daemon_proto.h | 2 FaceServer/sample_face_search.h | 6 ++- FaceServer/compare2.jpg | 0 FaceServer/sample_face_search.cpp | 40 ++++++++++++++++++++ FaceServer/test_client_compare.cpp | 32 ++++++++++++--- FaceServer/STFaceCache.h | 2 8 files changed, 97 insertions(+), 17 deletions(-) diff --git a/FaceServer/STFaceCache.cpp b/FaceServer/STFaceCache.cpp index b527a40..fa5bf46 100644 --- a/FaceServer/STFaceCache.cpp +++ b/FaceServer/STFaceCache.cpp @@ -23,6 +23,16 @@ STFaceCacheContext() : handle_verify(nullptr), handle_detect(nullptr) { } + + stface_handles getStFaceHandles() + { + //return (stface_handles*)this; + + stface_handles handles; + handles.handle_verify = handle_verify; + handles.handle_detect = handle_detect; + return handles; + } }; struct STFaceDBContext @@ -320,3 +330,14 @@ else return FDP_FaceDetectResult(img.db_id, idx, 0); } + +FDP_FaceDetectResult STFaceCache::compare(const STFaceImage& img1, const STFaceImage& img2) +{ + stface_ctx_map_t& dbContext(*(stface_ctx_map_t*)_dbContext); + STFaceCacheContext& cacheContext(*(STFaceCacheContext*)_cacheContext); + + stface_handles handles(cacheContext.getStFaceHandles()); + float c = stface_compare(handles, img1, img2); + FDP_FaceDetectResult result(0, 0, int(c * 1000)); + return result; +} diff --git a/FaceServer/STFaceCache.h b/FaceServer/STFaceCache.h index 4a9f723..6d5442b 100644 --- a/FaceServer/STFaceCache.h +++ b/FaceServer/STFaceCache.h @@ -20,7 +20,7 @@ FDP_FaceDetectResult detect(const STFaceImage& img); FDP_FaceDetectResult add(const STFaceImage& img); fdr_vec_t search(const STFaceImage& img); - FDP_FaceDetectResult compare(const STFaceImage& img); + FDP_FaceDetectResult compare(const STFaceImage& img1, const STFaceImage& img2); //#todo need a delete img, if business not linked faceid and its personid // they can delete it and save/find again! diff --git a/FaceServer/compare2.jpg b/FaceServer/compare2.jpg new file mode 100644 index 0000000..36f65e4 --- /dev/null +++ b/FaceServer/compare2.jpg Binary files differ diff --git a/FaceServer/face_daemon_proto.h b/FaceServer/face_daemon_proto.h index 1ac3a8a..2c2aca0 100644 --- a/FaceServer/face_daemon_proto.h +++ b/FaceServer/face_daemon_proto.h @@ -53,7 +53,7 @@ { int32_t db_id; int32_t st_id; // sensetime id - int16_t confidence; // 1000 times of float confidence + int16_t confidence; // 1000 times of float confidence, less than zero means error FDP_FaceDetectResult(int32_t _db_id, int32_t _st_id, int _confidence) : db_id(_db_id), st_id(_st_id), confidence(_confidence) {} diff --git a/FaceServer/main_face_daemon.cpp b/FaceServer/main_face_daemon.cpp index ec706f7..039ec87 100644 --- a/FaceServer/main_face_daemon.cpp +++ b/FaceServer/main_face_daemon.cpp @@ -183,12 +183,11 @@ //fclose(pFile); //pFile = nullptr; - //fdr_vec_t result; - //FDP_FaceDetectResult fdrResult = g_STFaceCache.add(stfaceImg); - //result.push_back(fdrResult); - // - //int ret = (fdrResult.db_id == 0 ? -1 : 0); - //return send_SensetimeFaceDetectResultJson(client, result, ret); + fdr_vec_t result; + FDP_FaceDetectResult fdrResult = g_STFaceCache.compare(stfaceImg1, stfaceImg2); + result.push_back(fdrResult); + + return send_SensetimeFaceDetectResultJson(client, result, 0); } bool ev_dispatcher_proto_pb(EVClientStub& client) diff --git a/FaceServer/sample_face_search.cpp b/FaceServer/sample_face_search.cpp index 93a6bdc..ac36fc4 100644 --- a/FaceServer/sample_face_search.cpp +++ b/FaceServer/sample_face_search.cpp @@ -133,6 +133,17 @@ // fclose(pFile); //} } + else if (image.mb_type == MB_Frame::MBFT_JPEG) + { + Mat matTmp = imdecode(_InputArray(image.buff, image.size), CV_LOAD_IMAGE_COLOR); + + //imwrite("aaa.jpg", matTmp); + + imgbufSize = matTmp.total() * matTmp.elemSize(); + memcpy(imgbuf, matTmp.ptr(), imgbufSize); + + stimgfmt = CV_PIX_FMT_BGR888; + } else { LOG_WARN << "mb frame type not support" << LOG_ENDL; @@ -178,6 +189,35 @@ return p_feature; } +float stface_compare(stface_handles& handles, const STFaceImage& image1, const STFaceImage& image2) +{ + cv_feature_t* f1 = stface_extract_feature(handles, image1); + if (f1 == nullptr) + { + LOGP(INFO, "can't find face in image1"); + return -1.0; + } + + cv_feature_t* f2 = stface_extract_feature(handles, image2); + if (f2 == nullptr) + { + cv_verify_release_feature(f1); + LOGP(INFO, "can't find face in image1"); + return -1.0; + } + + float score = -1.0; + cv_result_t cv_result = cv_verify_compare_feature(handles.handle_verify, f1, f2, &score); + if (cv_result != CV_OK) { + LOGP(DEBUG, "cv_verify_compare_feature failed, error code %d", cv_result); + score = -1.0; + } + + cv_verify_release_feature(f1); + cv_verify_release_feature(f2); + return score; +} + int stface_db_add(stface_handles& handles, const char *image_path) { cv_feature_t *p_feature = stface_extract_feature(handles, image_path); if (!p_feature) { diff --git a/FaceServer/sample_face_search.h b/FaceServer/sample_face_search.h index 8d6075a..e121b16 100644 --- a/FaceServer/sample_face_search.h +++ b/FaceServer/sample_face_search.h @@ -10,10 +10,10 @@ struct stface_handles { cv_handle_t handle_verify; - cv_handle_t handle_db; cv_handle_t handle_detect; + cv_handle_t handle_db; - stface_handles() : handle_verify(nullptr), handle_db(nullptr), handle_detect(nullptr) + stface_handles() : handle_verify(nullptr), handle_detect(nullptr), handle_db(nullptr) {} }; @@ -41,6 +41,8 @@ cv_feature_t *stface_extract_feature(stface_handles& handles, const char *image_path); cv_feature_t *stface_extract_feature(stface_handles& handles, const STFaceImage& image); +float stface_compare(stface_handles& handles, const STFaceImage& image1, const STFaceImage& image2); + int stface_db_add(stface_handles& handles, const char *image_path); int stface_db_add(stface_handles& handles, const STFaceImage& image); diff --git a/FaceServer/test_client_compare.cpp b/FaceServer/test_client_compare.cpp index 59f4633..e6a5ad9 100644 --- a/FaceServer/test_client_compare.cpp +++ b/FaceServer/test_client_compare.cpp @@ -67,20 +67,38 @@ FDP_Image* fdpImage2 = nullptr; { fdpImage2 = new (mesg + evpHeader->size) FDP_Image; - + fdpImage2->db_id = 0; // -1 - fdpImage2->mb_type = MB_Frame::MBFT_RGB565; // 14 - fdpImage2->width = 52; - fdpImage2->height = 52; + fdpImage2->mb_type = MB_Frame::MBFT_JPEG; // 14 + fdpImage2->width = 198; + fdpImage2->height = 154; - FILE* pFile = fopen("face-13-w52-h52.rgb565", "rb"); + FILE* pFile = fopen("compare2.jpg", "rb"); fdpImage2->size = fread(fdpImage2->buff, 1, length, pFile); fclose(pFile); pFile = nullptr; - + evpHeader->size += sizeof(FDP_Image) + fdpImage2->size; fdpImage2->hton(); - } + } + + //FDP_Image* fdpImage2 = nullptr; + //{ + // fdpImage2 = new (mesg + evpHeader->size) FDP_Image; + // + // fdpImage2->db_id = 0; // -1 + // fdpImage2->mb_type = MB_Frame::MBFT_RGB565; // 14 + // fdpImage2->width = 52; + // fdpImage2->height = 52; + // + // FILE* pFile = fopen("face-13-w52-h52.rgb565", "rb"); + // fdpImage2->size = fread(fdpImage2->buff, 1, length, pFile); + // fclose(pFile); + // pFile = nullptr; + // + // evpHeader->size += sizeof(FDP_Image) + fdpImage2->size; + // fdpImage2->hton(); + //} length = evpHeader->size; evpHeader->hton(); -- Gitblit v1.8.0