From 035ea5433e1e5a7688c5ca7cb229aaded0626775 Mon Sep 17 00:00:00 2001
From: pans <pans@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期三, 28 十二月 2016 09:52:32 +0800
Subject: [PATCH] 

---
 RtspFace/demo/faceAPI.cpp           |    2 
 RtspFace/demo/新建文本文档.txt            |    1 
 RtspFace/demo/sample_face_track.cpp |  118 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 120 insertions(+), 1 deletions(-)

diff --git a/RtspFace/demo/faceAPI.cpp b/RtspFace/demo/faceAPI.cpp
index 128c124..c49a42c 100644
--- a/RtspFace/demo/faceAPI.cpp
+++ b/RtspFace/demo/faceAPI.cpp
@@ -1,7 +1,7 @@
 #include "faceAPI.h"
 #include "faceDB.h"
 
-faceDB fdb = faceDB::faceDB();
+faceDB fdb = faceDB();
 faceAPI::faceAPI(){
 	//创建静态人脸识别句柄,同时创建状态标量
 	cv_result_t cv_result = 0;
diff --git a/RtspFace/demo/sample_face_track.cpp b/RtspFace/demo/sample_face_track.cpp
new file mode 100644
index 0000000..69781fe
--- /dev/null
+++ b/RtspFace/demo/sample_face_track.cpp
@@ -0,0 +1,118 @@
+#include <vector>
+#include <stdio.h>
+#include <cv_face.h>
+
+#include <opencv2/opencv.hpp>
+
+using namespace std;
+using namespace cv;
+
+int main(int argc, char *argv[]) {
+	if (argc < 2) {
+		fprintf(stderr, "test_sample_face_track [alignment point size(21 or 106)] [detect face cont limit]\n");
+		fprintf(stderr, "for example: \"test_sample_face_track 21 1\"\n");
+		return -1;
+	}
+
+	VideoCapture capture;
+	capture.open(0);         // open the camera
+	if (!capture.isOpened()) {
+		fprintf(stderr, "can not open camera!\n");
+		return -1;
+	}
+	namedWindow("TrackingTest");
+	int frame_width = capture.get(CV_CAP_PROP_FRAME_WIDTH);
+	int frame_height = capture.get(CV_CAP_PROP_FRAME_HEIGHT);
+
+	int point_size = atoi(argv[1]);
+	int config;
+	if (point_size == 21) {
+		config = CV_DETECT_ENABLE_ALIGN_21;
+	}
+	else if (point_size == 106) {
+		config = CV_DETECT_ENABLE_ALIGN_106;
+	}
+	else {
+		fprintf(stderr, "alignment point size must be 21 or 106\n");
+		return -1;
+	}
+
+	cv_handle_t handle_track = NULL;
+	cv_result_t cv_result = CV_OK;
+	do {
+		// init handle
+		cv_result = cv_face_create_tracker(&handle_track, NULL, config | CV_FACE_TRACKING_TWO_THREAD);
+		if (cv_result != CV_OK) {
+			fprintf(stderr, "cv_face_create_tracker failed, error code %d\n", cv_result);
+			break;
+		}
+
+		if (argc == 3) {
+			int detect_face_cnt_limit = atoi(argv[2]);
+			if (detect_face_cnt_limit < -1) {
+				detect_face_cnt_limit = -1;
+			}
+			int val = 0;
+			cv_result = cv_face_track_set_detect_face_cnt_limit(handle_track, detect_face_cnt_limit, &val);
+			if (cv_result != CV_OK) {
+				fprintf(stderr, "cv_face_track_set_detect_face_cnt_limit failed, error : %d\n", cv_result);
+				break;
+			} else {
+				fprintf(stderr, "detect face count limit : %d\n", val);
+			}
+		}
+
+		Mat bgr_frame;
+		cv_face_t *p_face = NULL;
+		int face_count = 0;
+		while (capture.read(bgr_frame)) {       // CV_PIX_FMT_BGR888
+			resize(bgr_frame, bgr_frame, Size(frame_width, frame_height), 0, 0,
+				INTER_LINEAR);
+			// realtime track
+			face_count = 0;
+			cv_result = cv_face_track(handle_track, bgr_frame.data, CV_PIX_FMT_BGR888,
+				bgr_frame.cols, bgr_frame.rows, bgr_frame.step,
+				CV_FACE_UP, &p_face, &face_count);
+			if (cv_result != CV_OK) {
+				fprintf(stderr, "cv_face_track failed, error : %d\n", cv_result);
+				cv_face_release_tracker_result(p_face, face_count);
+				break;
+			}
+
+			for (int i = 0; i < face_count; i++) {
+				fprintf(stderr, "face: %d-----[%d, %d, %d, %d]-----id: %d\n", i,
+					p_face[i].rect.left, p_face[i].rect.top,
+					p_face[i].rect.right, p_face[i].rect.bottom, p_face[i].ID);
+				fprintf(stderr, "face pose: [yaw: %.2f, pitch: %.2f, roll: %.2f, eye distance: %.2f]\n",
+					p_face[i].yaw,
+					p_face[i].pitch, p_face[i].roll, p_face[i].eye_dist);
+
+				// draw the video
+				Scalar scalar_color = CV_RGB(p_face[i].ID * 53 % 256,
+					p_face[i].ID * 93 % 256,
+					p_face[i].ID * 143 % 256);
+				rectangle(bgr_frame, Point2f(static_cast<float>(p_face[i].rect.left),
+					static_cast<float>(p_face[i].rect.top)),
+					Point2f(static_cast<float>(p_face[i].rect.right),
+					static_cast<float>(p_face[i].rect.bottom)), scalar_color, 2);
+				for (int j = 0; j < p_face[i].points_count; j++) {
+					circle(bgr_frame, Point2f(p_face[i].points_array[j].x,
+						p_face[i].points_array[j].y), 1, Scalar(0, 255, 0));
+				}
+			}
+
+			// release the memory of face
+			cv_face_release_tracker_result(p_face, face_count);
+			imshow("TrackingTest", bgr_frame);
+			if (waitKey(1) != -1)
+				break;
+		}
+
+	} while (0);
+
+	// destroy track handle
+	cv_face_destroy_tracker(handle_track);
+
+	return 0;
+}
+
diff --git "a/RtspFace/demo/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt" "b/RtspFace/demo/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt"
new file mode 100644
index 0000000..3f608a3
--- /dev/null
+++ "b/RtspFace/demo/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt"
@@ -0,0 +1 @@
+#include "faceAPI.h"?#include "faceDB.h"??faceDB fdb = faceDB::faceDB();?faceAPI::faceAPI(){?	//创建静态人脸识别句柄,同时创建状态标量?	cv_result_t cv_result = 0;?	cv_face_create_detector(&handle_detect, NULL, CV_DETECT_ENABLE_ALIGN_21);?	cv_verify_create_handle(&handle_verify1, "verify.model");?	//faceDB* f_db = faceDB.GetInstance();?}??faceAPI::~faceAPI(){??}??int faceAPI::do_reasch(cv::Mat image){?	if (!image.data) {?		fprintf(stderr, "fail to read img\n");?		return -1;?	}else?		fprintf(stderr, "read img\n");?	p_f = extract_feature(image);?	if (!p_f)?	{?		fprintf(stderr, "p_f is null\n");?		return -2;?	}?	return p_img_search(p_f); ?}??int faceAPI::do_reasch(char* s_feature){?	get_feature(s_feature,p_f);?	return p_img_search(p_f);?}??int faceAPI::do_register(cv::Mat image){?	p_f = extract_feature(image);?	//db add?	int indx = 1;?	return indx;?}???int faceAPI::p_img_search(cv_feature_t *p_feature){?	std::cout<<"p img search"<<std::endl;?	?	return fdb.search_db(p_feature);?}??cv_feature_t* faceAPI::extract_feature(const cv::Mat image_color) {??	if (handle_verify1 != NULL)?	{?		fprintf(stderr, "handle_verify1 is not null!\n");?	} ?	else?	{?		fprintf(stderr, "handle_verify1 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_verify1,?			(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;?}???//@brief 特征值转换为字符串?//@param 特征值?//@return 字符串格式的特征值?int faceAPI::get_char(cv_feature_t *p_feature,char* feature_str){??	return cv_verify_serialize_feature(p_feature,feature_str);?}??//@brief 字符串转换为特征值?//@param 字符串格式的特征值?//@return 特征值?int faceAPI::get_feature(char *feature_str,cv_feature_t *p_feature){??	p_feature = cv_verify_deserialize_feature(feature_str);?	if(p_feature != NULL){?		return 0;?	}else?		return -1;?}
\ No newline at end of file

--
Gitblit v1.8.0