From a7ae929039ae0b0b9ee729619b670e014700fc2d Mon Sep 17 00:00:00 2001
From: houxiao <houxiao@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期五, 21 四月 2017 17:46:02 +0800
Subject: [PATCH] dev
---
FaceServer/STFaceCache.cpp | 5
FaceServer/make.sh | 25 +
FaceServer/main_face_daemon.cpp | 55 +++
FaceServer/face_daemon_proto.h | 6
FaceServer/face-13-w52-h52.rgb565 | 0
FaceServer/test_client_add.cpp | 126 ++++++++
FaceServer/sample_face_search.cpp | 145 +++++++++
FaceServer/face-20-w49-h49.rgb565 | 0
FaceServer/test_client_detect.cpp | 0
FaceServer/pseudo_stfacesdk.cpp | 523 ++++++++++++++++++++++++++++++++++
10 files changed, 871 insertions(+), 14 deletions(-)
diff --git a/FaceServer/STFaceCache.cpp b/FaceServer/STFaceCache.cpp
index 82f18e3..2c094f9 100644
--- a/FaceServer/STFaceCache.cpp
+++ b/FaceServer/STFaceCache.cpp
@@ -9,6 +9,8 @@
#include "sample_face_search.h"
#include <cv_face.h>
+#define ENABLE_AUTO_CREATE_STFACEDB
+
struct STFaceCacheContext
{
cv_handle_t handle_verify;
@@ -222,6 +224,8 @@
}
stface_ctx_map_t::iterator iterCtx = dbContext.find(img.db_id);
+
+#ifdef ENABLE_AUTO_CREATE_STFACEDB
if (iterCtx == dbContext.end())
{
// create db
@@ -247,6 +251,7 @@
dbContext.insert(std::make_pair(ctx.dbid, ctx));
iterCtx = dbContext.find(img.db_id);
}
+#endif
if (iterCtx == dbContext.end())
{
diff --git a/FaceServer/face-13-w52-h52.rgb565 b/FaceServer/face-13-w52-h52.rgb565
new file mode 100644
index 0000000..7f8454e
--- /dev/null
+++ b/FaceServer/face-13-w52-h52.rgb565
Binary files differ
diff --git a/FaceServer/face-20-w49-h49.rgb565 b/FaceServer/face-20-w49-h49.rgb565
new file mode 100644
index 0000000..7fcd747
--- /dev/null
+++ b/FaceServer/face-20-w49-h49.rgb565
Binary files differ
diff --git a/FaceServer/face_daemon_proto.h b/FaceServer/face_daemon_proto.h
index 63d5741..eb475b6 100644
--- a/FaceServer/face_daemon_proto.h
+++ b/FaceServer/face_daemon_proto.h
@@ -30,6 +30,8 @@
int16_t width;
int16_t height;
uint8_t buff[0];
+
+ void hton();//#todo
};
struct FDP_FaceDetectPB
@@ -39,7 +41,7 @@
FDP_FaceDetectPB(int32_t _db_id) : db_id(_db_id)
{}
- void hton();
+ void hton();//#todo
};
struct FDP_FaceDetectResult
@@ -50,7 +52,7 @@
FDP_FaceDetectResult(int32_t _db_id, int32_t _st_id) : db_id(_db_id), st_id(_st_id)
{}
- void hton();
+ void hton();//#todo
};
#pragma pack()
diff --git a/FaceServer/main_face_daemon.cpp b/FaceServer/main_face_daemon.cpp
index bcbfafb..86fee13 100644
--- a/FaceServer/main_face_daemon.cpp
+++ b/FaceServer/main_face_daemon.cpp
@@ -25,11 +25,11 @@
server_stop();
}
-bool send_SensetimeFaceDetectResultJson(EVClientStub& client, const fdr_vec_t& result)
+bool send_SensetimeFaceDetectResultJson(EVClientStub& client, const fdr_vec_t& result, int ret = 0)
{
std::stringstream ss;
ss << "{" << LOG_ENDL;
- ss << "\"ret\":" << WRAPPER_TEXT(0) << "," << LOG_ENDL;
+ ss << "\"ret\":" << WRAPPER_TEXT(ret) << "," << LOG_ENDL;
ss << "\"count\":" << WRAPPER_TEXT(result.size()) << "," << LOG_ENDL;
ss << "\"result\":[";
for(fdr_vec_t::const_iterator iter = result.begin(); iter != result.end(); ++iter)
@@ -103,6 +103,27 @@
return send_SensetimeFaceDetectResultJson(client, result);
}
+bool ev_proc_SensetimeFaceDetectSave(EVClientStub& client)
+{
+ EVPHeader* evpHeader = (EVPHeader*)client.recvBuff;
+ FDP_Image* fdpImage = (FDP_Image*)(client.recvBuff + sizeof(EVPHeader));
+
+ STFaceImage stfaceImg;
+ stfaceImg.db_id = fdpImage->db_id;
+ stfaceImg.mb_type = fdpImage->mb_type;
+ stfaceImg.width = fdpImage->width;
+ stfaceImg.height = fdpImage->height;
+ stfaceImg.size = evpHeader->size - sizeof(EVPHeader) - sizeof(FDP_Image);
+ stfaceImg.buff = fdpImage->buff;
+
+ 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);
+}
+
bool ev_dispatcher_proto_pb(EVClientStub& client)
{
LOG_DEBUG << "ev_dispatcher_proto_pb" << LOG_ENDL;
@@ -131,6 +152,33 @@
return false;
}
+bool ev_dispatcher_proto_rawbin(EVClientStub& client)
+{
+ LOG_DEBUG << "ev_dispatcher_proto_pb" << LOG_ENDL;
+
+ EVPHeader* evpHeader = (EVPHeader*)client.recvBuff;
+ if (evpHeader->size != client.recvBuffSize)
+ {
+ LOG_WARN << "Truncated buffer " << (evpHeader->size - client.recvBuffSize) << " bytes" << LOG_ENDL;
+ return false;
+ }
+
+ switch(evpHeader->cmd)
+ {
+ case FaceDaemonCommand::FDC_SENSETIMEFACEDETECT_SAVE:
+ return ev_proc_SensetimeFaceDetectSave(client);
+ break;
+ default:
+ LOG_WARN << "Unknown command" << LOG_ENDL;
+ ev_send_status_packet(client, EVPStatus::EVPS_COMMAND_ERROR);
+ return false;
+ break;
+ }
+
+ // return false to disconnect
+ return false;
+}
+
bool ev_dispatcher_proto(EVClientStub& client)
{
LOG_DEBUG << "ev_dispatcher_proto" << LOG_ENDL;
@@ -147,6 +195,9 @@
case EVPProto::EVPP_PROTOBUF:
return ev_dispatcher_proto_pb(client);
break;
+ case EVPProto::EVPP_RAW_BIN:
+ return ev_dispatcher_proto_rawbin(client);
+ break;
default:
LOG_WARN << "Unknown proto" << LOG_ENDL;
ev_send_status_packet(client, EVPStatus::EVPS_PROTO_ERROR);
diff --git a/FaceServer/make.sh b/FaceServer/make.sh
index dd03a91..dae06e5 100644
--- a/FaceServer/make.sh
+++ b/FaceServer/make.sh
@@ -12,23 +12,28 @@
STFACESDK_INC="-I$STFACESDK_BASE/include"
STFACESDK_LIB="-L$STFACESDK_BASE/libs/linux-x86_64"
+LIBYUV_BASE=/opt/libyuv/inst
+LIBYUV_INC="-I$LIBYUV_BASE/include"
+LIBYUV_LIB="-L$LIBYUV_BASE/lib -lyuv"
+
OPENCV_LIB=`pkg-config --libs-only-l opencv`
-CPPFLAGS+="-g -c -std=c++11 -pthread -DSERVER_PORT=5432 -DSTFACESDK_BASE=\"$STFACESDK_BASE\" -I$PIPELINE_BASE -I$VISITFACE_BASE $PROTOBUF_INC $STFACESDK_INC "
-LDFLAGS+="-pthread -levent $PROTOBUF_LIB $STFACESDK_LIB $OPENCV_LIB " # -lcvface_api
+CPPFLAGS+="-g -c -std=c++11 -pthread -DSERVER_PORT=5432 -DSTFACESDK_BASE=\"$STFACESDK_BASE\" -I$PIPELINE_BASE -I$VISITFACE_BASE $PROTOBUF_INC $STFACESDK_INC $LIBYUV_INC "
+LDFLAGS+="-pthread -levent $PROTOBUF_LIB $STFACESDK_LIB $OPENCV_LIB $LIBYUV_LIB " # -lcvface_api
rm *.o
-rm face_server
-rm test_client
+rm face_server test_client_detect test_client_add
g++ $PIPELINE_BASE/Logger/src/logger.cc $CFLAGS $CPPFLAGS
g++ ev_server.cpp -DUSER_DEFINE_EVCLIENT_PROC $CFLAGS $CPPFLAGS
g++ $VISITFACE_BASE/PbFaceList.pb.cc $CFLAGS $CPPFLAGS
g++ main_face_daemon.cpp $CFLAGS $CPPFLAGS
g++ sample_face_search.cpp $CFLAGS $CPPFLAGS
+g++ pseudo_stfacesdk.cpp $CFLAGS $CPPFLAGS
g++ STFaceCache.cpp $CFLAGS $CPPFLAGS
-g++ test_client.cpp $CFLAGS $CPPFLAGS
+g++ test_client_detect.cpp $CFLAGS $CPPFLAGS
+g++ test_client_add.cpp $CFLAGS $CPPFLAGS
g++ -g -std=c++11 \
logger.o \
@@ -36,13 +41,19 @@
PbFaceList.pb.o \
main_face_daemon.o \
sample_face_search.o \
+ pseudo_stfacesdk.o \
STFaceCache.o \
$LDFLAGS -o face_server
#
g++ -g -std=c++11 \
- test_client.o \
- $LDFLAGS -o test_client
+ test_client_detect.o \
+ $LDFLAGS -o test_client_detect
+#
+
+g++ -g -std=c++11 \
+ test_client_add.o \
+ $LDFLAGS -o test_client_add
#
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/protobuf/inst/lib:/opt/st_face-6.3.1-verify_p1-linux-524d0c3/libs/linux-x86_64
diff --git a/FaceServer/pseudo_stfacesdk.cpp b/FaceServer/pseudo_stfacesdk.cpp
index e69de29..9ee95bd 100644
--- a/FaceServer/pseudo_stfacesdk.cpp
+++ b/FaceServer/pseudo_stfacesdk.cpp
@@ -0,0 +1,523 @@
+#include <cv_common.h>
+#include <cv_face.h>
+#include <cv_utils.h>
+
+CV_SDK_API cv_result_t cv_image_allocate(
+ int width,
+ int height,
+ cv_pixel_format pixel_format,
+ cv_image ** image
+)
+{
+ return 0;
+}
+
+CV_SDK_API void
+cv_image_release(cv_image* image)
+{
+}
+
+CV_SDK_API cv_result_t
+cv_common_color_convert(
+ const cv_image* image_src,
+ cv_image* image_dst
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_common_image_affine_transfer(
+ const cv_image *image_src,
+ const cv_pointf_t *src_points_array,
+ const int src_points_count,
+ const cv_pointf_t *dst_points_array,
+ const int dst_points_count,
+ cv_image *image_dst
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_common_image_resize(
+ const cv_image *image_src,
+ cv_image *image_dst,
+ cv_image_resize_method method
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_common_image_crop(
+ const cv_image *image_src,
+ const cv_rect_t *crop_area,
+ cv_image *image_dst
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_common_image_rotate(
+ const cv_image *image_src,
+ cv_image *image_dst,
+ unsigned int rotate_degree
+)
+{
+ return 0;
+}
+
+CV_SDK_API cv_result_t
+cv_common_load_model(
+ const char *file,
+ cv_model_t *model
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+void cv_common_unload_model(
+ cv_model_t model
+)
+{
+}
+
+CV_SDK_API cv_result_t
+cv_common_load_resource(
+ const unsigned char *model_start,
+ const unsigned char *model_end,
+ cv_model_t *model
+)
+{
+ return 0;
+}
+
+CV_SDK_API cv_result_t
+cv_common_load_composite_model(
+ const char *file,
+ cv_composite_model_t *model
+)
+{
+ return 0;
+}
+
+CV_SDK_API cv_result_t
+cv_common_unload_composite_model(
+ cv_composite_model_t model
+)
+{
+ return 0;
+}
+
+CV_SDK_API cv_result_t
+cv_common_composite_model_get_submodel(
+ cv_composite_model_t model,
+ const char *name,
+ cv_model_t *submodel
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+void
+cv_face_algorithm_info()
+{
+}
+
+CV_SDK_API
+cv_result_t
+cv_face_init_license_config(const char* szLicense)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_face_create_detector(
+ cv_handle_t *handle,
+ const char *model_path,
+ unsigned int config
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t cv_face_detect_get_threshold(
+ cv_handle_t detector_handle,
+ float *threshold
+ )
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t cv_face_detect_set_threshold(
+ cv_handle_t detector_handle,
+ float threshold
+ )
+{
+ return 0;
+}
+
+CV_SDK_API
+void cv_face_destroy_detector(
+ cv_handle_t detector_handle
+)
+{
+}
+
+CV_SDK_API
+cv_result_t
+cv_face_detect(
+ cv_handle_t detector_handle,
+ const unsigned char *image,
+ cv_pixel_format pixel_format,
+ int image_width,
+ int image_height,
+ int image_stride,
+ cv_face_orientation orientation,
+ cv_face_t **p_faces_array,
+ int *p_faces_count
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+void
+cv_face_release_detector_result(
+ cv_face_t *faces_array,
+ int faces_count
+)
+{
+ return;
+}
+
+CV_SDK_API
+cv_result_t
+cv_face_create_tracker(
+ cv_handle_t *handle,
+ const char *model_path,
+ unsigned int config
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+void
+cv_face_destroy_tracker(
+ cv_handle_t tracker_handle
+)
+{
+ return;
+}
+
+CV_SDK_API
+cv_result_t
+cv_face_track(
+ cv_handle_t tracker_handle,
+ const unsigned char *image,
+ cv_pixel_format pixel_format,
+ int image_width,
+ int image_height,
+ int image_stride,
+ cv_face_orientation orientation,
+ cv_face_t **p_faces_array,
+ int *p_faces_count
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+void
+cv_face_reset_tracker(
+ cv_handle_t tracker_handle
+)
+{
+ return;
+}
+
+CV_SDK_API
+void
+cv_face_release_tracker_result(
+ cv_face_t *faces_array,
+ int faces_count
+)
+{
+}
+
+CV_SDK_API
+cv_result_t
+cv_face_track_set_detect_face_cnt_limit(
+ cv_handle_t tracker_handle,
+ int detect_face_cnt_limit,
+ int* val
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_verify_create_handle(
+ cv_handle_t* handle,
+ const char *model_path
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_verify_duplicate_handle(
+ cv_handle_t old_handle,
+ cv_handle_t* new_handle
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+void
+cv_verify_destroy_handle(
+ cv_handle_t verify_handle
+)
+{
+ return;
+}
+
+CV_SDK_API
+int
+cv_verify_get_version(
+ cv_handle_t verify_handle
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+int
+cv_verify_get_feature_length(
+ cv_handle_t verify_handle
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_verify_get_feature(
+ cv_handle_t verify_handle,
+ const unsigned char *image,
+ cv_pixel_format pixel_format,
+ int image_width,
+ int image_height,
+ int image_stride,
+ const cv_face_t *face,
+ cv_feature_t **p_feature,
+ unsigned int *feature_blob_size
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_verify_serialize_feature(
+ const cv_feature_t *feature,
+ char *feature_str
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_feature_t *
+cv_verify_deserialize_feature(
+ const char *feature_str
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_verify_compare_feature(
+ cv_handle_t verify_handle,
+ const cv_feature_t *feature1,
+ const cv_feature_t *feature2,
+ float *score
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+void
+cv_verify_release_feature(
+ cv_feature_t *feature
+)
+{
+ return;
+}
+
+CV_SDK_API
+cv_result_t
+cv_verify_create_db(cv_handle_t *handle)
+{
+ return 0;
+}
+
+CV_SDK_API
+void
+cv_verify_destroy_db(
+ cv_handle_t db_handle
+)
+{
+}
+
+CV_SDK_API
+cv_result_t
+cv_verify_build_db(
+ cv_handle_t db_handle,
+ cv_feature_t* const *items,
+ unsigned int item_count
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_verify_add_face(
+ cv_handle_t db_handle,
+ const cv_feature_t *item,
+ int *idx
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_verify_delete_face(
+ cv_handle_t db_handle,
+ int idx
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_verify_save_db(
+ cv_handle_t db_handle,
+ const char *db_path
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_verify_load_db(
+ cv_handle_t db_handle,
+ const char *db_path
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_verify_search_face(
+ cv_handle_t verify_handle,
+ cv_handle_t db_handle,
+ const cv_feature_t *query,
+ unsigned int top_k,
+ int *top_idxs,
+ float *top_scores,
+ unsigned int *result_length
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_verify_search_face_from_list(
+ cv_handle_t verify_handle,
+ cv_feature_t* const *list_feature,
+ int list_count,
+ const cv_feature_t *query,
+ unsigned int top_k,
+ int *top_idxs,
+ float *top_scores,
+ unsigned int *result_length
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_verify_grouping(
+ cv_handle_t verify_handle,
+ const cv_feature_t * const *features,
+ unsigned int feature_count,
+ unsigned int *p_groups_array,
+ unsigned int *groups_count
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+void
+cv_verify_initialize_labels(
+ unsigned int *p_groups_array,
+ unsigned int feature_count
+)
+{
+}
+
+CV_SDK_API
+cv_result_t
+cv_face_create_clustering(
+cv_handle_t *clustering_handle,
+const char* model_path
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+cv_result_t
+cv_face_clustering(
+cv_handle_t clustering_handle,
+const cv_feature_t * const *features,
+unsigned int *labels,
+int size
+)
+{
+ return 0;
+}
+
+CV_SDK_API
+void
+cv_face_clustering_destroy(
+cv_handle_t clustering_handle
+)
+{
+}
diff --git a/FaceServer/sample_face_search.cpp b/FaceServer/sample_face_search.cpp
index 6876364..8889cac 100644
--- a/FaceServer/sample_face_search.cpp
+++ b/FaceServer/sample_face_search.cpp
@@ -1,4 +1,5 @@
#include "sample_face_search.h"
+#include <MaterialBuffer.h>
#include "STFaceCache.h"
#include <logger.h>
@@ -7,6 +8,11 @@
#include <cv_face.h>
#include <opencv2/opencv.hpp>
+#include <libyuv/convert.h>
+#define SUBSAMPLE(v, a) ((((v) + (a) - 1)) / (a))
+
+#define MAX_FACE_IMAGE_WIDTH 640
+#define MAX_FACE_IMAGE_HEIGHT 480
using namespace std;
using namespace cv;
@@ -46,7 +52,66 @@
return p_feature;
}
-cv_feature_t *stface_extract_feature(stface_handles& handles, const STFaceImage& image);//#todo
+cv_feature_t *stface_extract_feature(stface_handles& handles, const STFaceImage& image)
+{
+ cv_pixel_format stimgfmt = CV_PIX_FMT_GRAY8;
+
+ if (image.width > MAX_FACE_IMAGE_WIDTH || image.height > MAX_FACE_IMAGE_HEIGHT)
+ {
+ LOG_WARN << "image too big" << LOG_ENDL;
+ return nullptr;
+ }
+
+ uint8_t imgbuf[MAX_FACE_IMAGE_WIDTH * MAX_FACE_IMAGE_HEIGHT * 4];
+ size_t imgbufSize = 0;
+ if (image.mb_type == MB_Frame::MBFT_RGB565)
+ {
+ uint8* dst_y = (uint8*)(imgbuf);
+ uint8* dst_u = (uint8*)(dst_y + (image.height * image.width));
+ uint8* dst_v = (uint8*)(dst_u + (image.height * image.width / 4));
+
+ int ret = libyuv::RGB565ToI420(
+ image.buff, image.width,
+ dst_y, image.width,
+ dst_u, SUBSAMPLE(image.width, 2),
+ dst_v, SUBSAMPLE(image.width, 2),
+ image.width, image.height
+ );
+ imgbufSize = image.height * image.width * 1.5;
+ }
+ else
+ {
+ LOG_WARN << "mb frame type not support" << LOG_ENDL;
+ return nullptr;
+ }
+
+ Mat matImg(cv::Size(image.width, image.height), CV_8UC1, imgbuf);
+ if (!matImg.data)
+ {
+ return nullptr;
+ }
+
+ cv_feature_t *p_feature = nullptr;
+ cv_face_t *p_face = nullptr;
+ int face_count = 0;
+ cv_result_t st_result = CV_OK;
+ st_result = cv_face_detect(handles.handle_detect, matImg.data, stimgfmt, matImg.cols, matImg.rows, matImg.step, CV_FACE_UP, &p_face, &face_count);
+ if (face_count >= 1)
+ {
+ st_result = cv_verify_get_feature(handles.handle_verify, (unsigned char *)matImg.data, stimgfmt, matImg.cols, matImg.rows, matImg.step, p_face, &p_feature, nullptr);
+ if (st_result != CV_OK)
+ {
+ LOGP(DEBUG, "cv_verify_get_feature failed, error code %d\n", st_result);
+ }
+ }
+ else
+ {
+ LOGP(DEBUG, "can't find face in");
+ }
+ // release the memory of face
+ cv_face_release_detector_result(p_face, face_count);
+ return p_feature;
+}
int stface_db_add(stface_handles& handles, const char *image_path) {
cv_feature_t *p_feature = stface_extract_feature(handles, image_path);
@@ -62,7 +127,22 @@
return idx;
}
-int stface_db_add(stface_handles& handles, const STFaceImage& image);//#todo
+int stface_db_add(stface_handles& handles, const STFaceImage& image)
+{
+ cv_feature_t *p_feature = stface_extract_feature(handles, image);
+ if (!p_feature)
+ {
+ return -1;
+ }
+ int idx;
+ cv_result_t cv_result = cv_verify_add_face(handles.handle_db, p_feature, &idx);
+ if (cv_result != CV_OK)
+ {
+ LOGP(DEBUG, "cv_verify_add_face failed, error code %d\n", cv_result);
+ }
+ cv_verify_release_feature(p_feature);
+ return idx;
+}
bool stface_db_del(stface_handles& handles, int idx) {
if (idx < 0) {
@@ -104,6 +184,25 @@
LOGP(DEBUG, "load done!\n");
}
+ return true;
+}
+
+bool stface_db_create(stface_handles& handles, const char *db_path)
+{
+ cv_result_t cv_result = cv_verify_create_db(&handles.handle_db);
+ if (cv_result != CV_OK)
+ {
+ LOG_WARN << "cv_verify_create_db return false" << LOG_ENDL;
+ return false;
+ }
+
+ cv_result = cv_verify_save_db(handles.handle_db, db_path);
+ if (cv_result != CV_OK)
+ {
+ LOG_WARN << "cv_verify_save_db return false" << LOG_ENDL;
+ return false;
+ }
+
return true;
}
@@ -193,7 +292,47 @@
return true;
}
-bool stface_search_db(stface_handles& handles, const STFaceImage& image, top_idx_score_vect_t& result);//#todo
+bool stface_search_db(stface_handles& handles, const STFaceImage& image, top_idx_score_vect_t& result)
+{
+ cv_feature_t *p_feature = stface_extract_feature(handles, image);
+ if (p_feature == nullptr)
+ {
+ LOGP(DEBUG, "extract failed !\n");
+ return false;
+ }
+
+ int top_k = 10;
+ int *top_idxs = new int[top_k];
+ float *top_scores = new float[top_k];
+ unsigned int result_length = 0;
+ cv_result_t cv_result = cv_verify_search_face(handles.handle_verify, handles.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;
+ LOGP(DEBUG, "%d\t", top_idxs[t]);
+ LOGP(DEBUG, "%0.2f\n", top_scores[t]);
+
+ result.push_back(TopIdxScore(top_idxs[t], top_scores[t]));
+ }
+ }
+ else
+ {
+ LOGP(DEBUG, "cv_verify_search_face failed, error code %d\n", cv_result);
+ }
+ if (top_idxs)
+ {
+ delete[] top_idxs;
+ }
+ if (top_scores)
+ {
+ delete[] top_scores;
+ }
+ cv_verify_release_feature(p_feature);
+
+ return true;
+}
bool stface_search_list(stface_handles& handles, char *image_path, char *list_path) {
cv_feature_t *p_feature = stface_extract_feature(handles, image_path);
diff --git a/FaceServer/test_client_add.cpp b/FaceServer/test_client_add.cpp
new file mode 100644
index 0000000..6a07947
--- /dev/null
+++ b/FaceServer/test_client_add.cpp
@@ -0,0 +1,126 @@
+/************************************
+ * For msmr
+ * server.c
+ * tesing the speed of bufferevent_write
+ * 2015-02-03
+ * author@tom
+************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <event2/event.h>
+#include <event2/bufferevent.h>
+#include <event2/buffer.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+
+#include <unistd.h>
+
+#include "ev_proto.h"
+#include "face_daemon_proto.h"
+
+#include <MaterialBuffer.h>
+
+/*
+void make_msg(char* mesg, int& length)
+{
+ EVPHeader* evpHeader = new (mesg) EVPHeader;
+ evpHeader->proto = EVPProto::EVPP_PROTOBUF;
+ evpHeader->cmd = FaceDaemonCommand::FDC_SENSETIMEFACEDETECT_PB;
+ evpHeader->size = length;
+
+ FILE* pFile = fopen("facelist-3.pb", "rb");
+ size_t fsize = fread(mesg + sizeof(EVPHeader), 1, length - sizeof(EVPHeader), pFile);
+ fclose(pFile);
+}
+*/
+
+void make_msg(char* mesg, int& length)
+{
+ EVPHeader* evpHeader = new (mesg) EVPHeader;
+ FDP_Image* fdpImage = new (mesg + sizeof(EVPHeader)) FDP_Image;
+
+ evpHeader->proto = EVPProto::EVPP_RAW_BIN;
+ evpHeader->cmd = FaceDaemonCommand::FDC_SENSETIMEFACEDETECT_SAVE;
+ evpHeader->size = sizeof(EVPHeader) + sizeof(FDP_Image);
+
+ fdpImage->db_id = 123;
+ fdpImage->mb_type = MB_Frame::MBFT_RGB565;
+ fdpImage->width = 52;
+ fdpImage->height = 52;
+
+ FILE* pFile = fopen("face-13-w52-h52.rgb565", "rb");
+ length = fread(fdpImage->buff, 1, length, pFile);
+ fclose(pFile);
+
+ evpHeader->size += length;
+ length = evpHeader->size;
+}
+
+int main()
+{
+ // build the message to be sent
+ int length = 1024 * 1024; // the size of message
+ char* mesg = (char*)malloc((length+1)*sizeof(char)); // Look out the end mark '/0' of a C string
+ if (mesg == NULL)
+ exit(1);
+ int i;
+ //for (i=0; i<length; i++)
+ // strcat(mesg, "a");
+
+ make_msg(mesg, length);
+
+ printf("%s\n", mesg);
+ printf("%d\n", (int)strlen(mesg));
+
+ // build socket
+ int port = 5432;
+
+ struct sockaddr_in server_addr;
+ memset(&server_addr, 0, sizeof(server_addr));
+ server_addr.sin_family = AF_INET;
+ server_addr.sin_addr.s_addr = inet_addr("192.168.1.146");
+ server_addr.sin_port = htons(port);
+
+ // build event base
+ struct event_base* base = event_base_new();
+
+ // set TCP_NODELAY to let data arrive at the server side quickly
+ evutil_socket_t fd;
+ fd = socket(AF_INET, SOCK_STREAM, 0);
+ struct bufferevent* conn = bufferevent_socket_new(base,fd,BEV_OPT_CLOSE_ON_FREE);
+ int enable = 1;
+ if(setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (void*)&enable, sizeof(enable)) < 0)
+ printf("ERROR: TCP_NODELAY SETTING ERROR!\n");
+ //bufferevent_setcb(conn, NULL, NULL, NULL, NULL); // For client, we don't need callback function
+ bufferevent_enable(conn, EV_WRITE);
+ if(bufferevent_socket_connect(conn,(struct sockaddr*)&server_addr,sizeof(server_addr)) == 0)
+ printf("connect success\n");
+
+ // start to send data
+ bufferevent_write(conn,mesg,length);
+ // check the output evbuffer
+ struct evbuffer* output = bufferevent_get_output(conn);
+
+ event_base_dispatch(base);
+
+ char readbuf[10];
+ int readbufsize = read(fd, readbuf, sizeof(readbuf));
+ while(readbufsize>0)
+ {
+ readbuf[readbufsize] = '\0';
+ printf("%s", readbuf);
+ readbufsize = read(fd, readbuf, sizeof(readbuf));
+ }
+ printf("\n");
+
+ free(mesg);
+ mesg = NULL;
+
+ bufferevent_free(conn);
+ event_base_free(base);
+
+ printf("Client program is over\n");
+
+ return 0;
+}
\ No newline at end of file
diff --git a/FaceServer/test_client.cpp b/FaceServer/test_client_detect.cpp
similarity index 100%
rename from FaceServer/test_client.cpp
rename to FaceServer/test_client_detect.cpp
--
Gitblit v1.8.0