Commit 54f9efee by guanghui.cui

代码结构调整

parent e3017f8f
...@@ -44,11 +44,187 @@ using namespace std; ...@@ -44,11 +44,187 @@ using namespace std;
#pragma comment(lib, "../lib/libcurl.lib") #pragma comment(lib, "../lib/libcurl.lib")
#endif #endif
std::string strUrl = "http://139.196.195.9:8788/facesearch/search4File"; /****************************************
全局变量定义
****************************************/
std::string strUrl = "http://139.196.195.9:8788/facesearch/search4File"; //接口URL
std::vector<TargetInfo> track_dets; //跟踪目标所在位置 std::vector<TargetInfo> track_dets; //跟踪目标所在位置
CvxText text("kaiti.ttf"); //字库,否则不支持中文
int64 time_start = cv::getTickCount(), time_end; //时间戳,用于计算视频播放帧率
int fps = 0; //帧率
/****************************************
函数声明
****************************************/
//获取目标位置
std::vector<dlib::rectangle> _get_rc_detectors(std::vector<TargetInfo> &vecTargets);
//裁剪目标图片并保存到本地
bool _save_target_img(cv::Mat &img, dlib::rectangle &rc, const char* path);
// curl回调函数
size_t req_reply(void *ptr, size_t size, size_t nmemb, void *stream);
// http POST
CURLcode curl_post_req(const string &url, const string imgPath, string &response);
//回调函数,根据图片请求用户信息
void reqUserInfoByImg(int index, string &imgPath);
//更新图片文字显示
void update_img_text(cv::Mat &image, int iframe, int target);
/****************************************
主函数
****************************************/
int main()
{
try
{
// global init curl
curl_global_init(CURL_GLOBAL_ALL);
cv::VideoCapture cap(0);
if (!cap.isOpened())
{
LOG(ERROR) << "Unable to connect to camera";
return 1;
}
dlib::image_window win;
// Load face detection and pose estimation models.
dlib::frontal_face_detector detector = dlib::get_frontal_face_detector();
dlib::shape_predictor pose_model;
dlib::deserialize("shape_predictor_68_face_landmarks.dat") >> pose_model;
std::string strFilePath = GetProcDir();
std::threadpool pool; //线程池
int frame_count = 0;
std::vector<dlib::rectangle> dets;
std::vector<TargetInfo> temp_dets; //缓存位置信息
std::vector<dlib::correlation_tracker> vecTracker; //跟踪目标
unsigned int iReqServerCount = 1; //服务器请求计数,同时也是目标唯一标识
int max_target = 4; //最大目标数量
for (int i = 0; i < max_target; i++) {
dlib::correlation_tracker tracker;
vecTracker.push_back(tracker);
TargetInfo track_det;
track_dets.push_back(track_det);
temp_dets.push_back(track_det);
}
int target = 0;
bool bTargetUpdate = true; //目标检测更新
// Grab and process frames until the main window is closed by the user.
while (!win.is_closed())
{
frame_count++;
// Grab a frame
cv::Mat origin,temp;
if (!cap.read(temp))
{
break;
}
//cv::resize(origin, temp, cv::Size(origin.cols * 1.5, origin.rows * 1.5), 0, 0, cv::INTER_LINEAR); //图片缩放
dlib::cv_image<dlib::bgr_pixel> cimg(temp);
//每18帧更新一次
if (frame_count % 30 == 0) {
//faces = detector(cimg);
dets = detector(cimg);
target = dets.size() > max_target ? max_target : dets.size();
for (int i = 0; i < target; i++) {
vecTracker[i].start_track(cimg, dlib::centered_rect((dets[i].right() + dets[i].left()) / 2, (dets[i].top() + dets[i].bottom()) / 2, dets[i].width(), dets[i].height()));
}
for (int i = 0; i < max_target; i++) {
temp_dets[i] = track_dets[i]; //缓存历史数据
//清空目标容器数据
track_dets[i].rc = { 0,0,0,0 };
track_dets[i].strConfidence = "";
track_dets[i].bSuccess = false;
track_dets[i].strName = "";
track_dets[i].strPhone = "";
track_dets[i].iCode = 0;
}
bTargetUpdate = true;
}
//每6帧更新跟踪目标
if (frame_count % 1 == 0) {
for (int i = 0; i < target; i++) {
vecTracker[i].update(cimg);
dlib::rectangle new_position= vecTracker[i].get_position();
//查询当前目标是否已存在
if (bTargetUpdate) {
bool bTargetFind = false; //目标是否已存在
for (auto rcTarget : temp_dets) {
if (abs(rcTarget.rc.left() - new_position.left()) < 50 && abs(rcTarget.rc.top() - new_position.top()) < 50) {
LOG(INFO) << "name:" << rcTarget.strName.data();
track_dets[i] = rcTarget;
bTargetFind = true;
}
}
if (!bTargetFind || !track_dets[i].bSuccess) {
track_dets[i].rc = new_position;
track_dets[i].iCode = iReqServerCount;
//启动查询线程,查询用户信息
std::string strPathImg = strFilePath+"tempimg"+ to_string(i)+".jpg";
LOG(INFO) << "path:" << strPathImg.data();
if (_save_target_img(temp, new_position, strPathImg.data())) {
//查询提交到线程池
pool.commit(reqUserInfoByImg, iReqServerCount, strPathImg);
}
LOG(INFO) << "iReqServerCount:" << iReqServerCount;
iReqServerCount++;
}
}
else {
//防抖(位移超过8像素时才更新位置)
int moveSize = abs(track_dets[i].rc.left() - vecTracker[i].get_position().left());
if (moveSize> 8) {
track_dets[i].rc = new_position;
}
}
}
}
bTargetUpdate = false;
update_img_text(temp, frame_count, target);
// Display it all on the screen
win.clear_overlay();
win.set_image(cimg);
win.add_overlay(_get_rc_detectors(track_dets), dlib::rgb_pixel(0, 255, 0));
//计数超过10000,计数归零
if (frame_count > 100000)
frame_count = 0;
}
}
catch (dlib::serialization_error& e)
{
LOG(ERROR) <<"dlib::serialization_error:" << e.what();
}
catch (exception& e)
{
LOG(ERROR)<<"exception:" << e.what();
}
// global release
curl_global_cleanup();
return 0;
}
//获取目标位置
std::vector<dlib::rectangle> _get_rc_detectors(std::vector<TargetInfo> &vecTargets) std::vector<dlib::rectangle> _get_rc_detectors(std::vector<TargetInfo> &vecTargets)
{ {
std::vector<dlib::rectangle> final_dets(vecTargets.size()); std::vector<dlib::rectangle> final_dets(vecTargets.size());
...@@ -57,7 +233,8 @@ std::vector<dlib::rectangle> _get_rc_detectors(std::vector<TargetInfo> &vecTarge ...@@ -57,7 +233,8 @@ std::vector<dlib::rectangle> _get_rc_detectors(std::vector<TargetInfo> &vecTarge
return final_dets; return final_dets;
} }
bool _save_target_img(cv::Mat &img, dlib::rectangle &rc,const char* path) //裁剪目标图片并保存到本地
bool _save_target_img(cv::Mat &img, dlib::rectangle &rc, const char* path)
{ {
int rcX = rc.left(); int rcX = rc.left();
int rcY = rc.top(); int rcY = rc.top();
...@@ -87,7 +264,7 @@ bool _save_target_img(cv::Mat &img, dlib::rectangle &rc,const char* path) ...@@ -87,7 +264,7 @@ bool _save_target_img(cv::Mat &img, dlib::rectangle &rc,const char* path)
return cv::imwrite(path, newPhoto, compression_params); return cv::imwrite(path, newPhoto, compression_params);
} }
// reply of the requery // curl回调函数
size_t req_reply(void *ptr, size_t size, size_t nmemb, void *stream) size_t req_reply(void *ptr, size_t size, size_t nmemb, void *stream)
{ {
string *str = (string*)stream; string *str = (string*)stream;
...@@ -147,6 +324,7 @@ CURLcode curl_post_req(const string &url, const string imgPath, string &response ...@@ -147,6 +324,7 @@ CURLcode curl_post_req(const string &url, const string imgPath, string &response
return res; return res;
} }
//回调函数,根据图片请求用户信息
void reqUserInfoByImg(int index, string &imgPath) void reqUserInfoByImg(int index, string &imgPath)
{ {
std::string postResponseStr; std::string postResponseStr;
...@@ -169,9 +347,9 @@ void reqUserInfoByImg(int index, string &imgPath) ...@@ -169,9 +347,9 @@ void reqUserInfoByImg(int index, string &imgPath)
float fNum = 0.00; float fNum = 0.00;
fNum = atof(response.vecUser[0].confidence.data()); fNum = atof(response.vecUser[0].confidence.data());
if (fNum > 80.000) { if (fNum > 80.000) {
target.strName = "姓名" + response.vecUser[0].memberName; target.strName = "姓名:" + response.vecUser[0].memberName;
target.strPhone = "电话" + response.vecUser[0].memberTel; target.strPhone = "电话:" + response.vecUser[0].memberTel;
target.strConfidence = "相似度" + response.vecUser[0].confidence; target.strConfidence = "相似度:" + response.vecUser[0].confidence;
} }
} }
else { else {
...@@ -186,196 +364,26 @@ void reqUserInfoByImg(int index, string &imgPath) ...@@ -186,196 +364,26 @@ void reqUserInfoByImg(int index, string &imgPath)
} }
} }
//更新图片文字显示
int main() void update_img_text(cv::Mat &image, int iframe, int target)
{ {
try
{
// global init curl
curl_global_init(CURL_GLOBAL_ALL);
LOG(INFO) << "Log Test";
cv::VideoCapture cap(0);
if (!cap.isOpened())
{
cerr << "Unable to connect to camera" << endl;
return 1;
}
dlib::image_window win;
// Load face detection and pose estimation models.
dlib::frontal_face_detector detector = dlib::get_frontal_face_detector();
dlib::shape_predictor pose_model;
dlib::deserialize("shape_predictor_68_face_landmarks.dat") >> pose_model;
std::string strFilePath = GetProcDir();
//std::string strPathImg = strFilePath + "tmpimg.jpg";
std::threadpool pool; //线程池
int frame_count = 0;
std::vector<dlib::rectangle> dets;
std::vector<TargetInfo> temp_dets; //缓存位置信息
std::vector<dlib::correlation_tracker> vecTracker; //跟踪目标
unsigned int iReqServerCount = 1; //服务器请求计数,同时也是目标唯一标识
int max_target = 4; //最大目标数量
for (int i = 0; i < max_target; i++) {
dlib::correlation_tracker tracker;
vecTracker.push_back(tracker);
TargetInfo track_det;
track_det.strName = "姓名:";
track_det.strPhone = "电话:";
track_dets.push_back(track_det);
temp_dets.push_back(track_det);
}
// For measuring the timings
int64 t1, t0 = cv::getTickCount();
double fps = 10;
CvxText text("kaiti.ttf"); //加载字库,否则不支持中文
//float p = 0.8;
//text.setFont(NULL, NULL, NULL, &p);
// Grab and process frames until the main window is closed by the user.
int target = 0;
bool bTargetUpdate = true; //目标检测更新
while (!win.is_closed())
{
frame_count++;
// Grab a frame
cv::Mat origin,temp;
if (!cap.read(temp))
{
break;
}
//cv::resize(origin, temp, cv::Size(origin.cols * 1.5, origin.rows * 1.5), 0, 0, cv::INTER_LINEAR); //图片缩放
dlib::cv_image<dlib::bgr_pixel> cimg(temp);
//每18帧更新一次
if (frame_count % 30 == 0) {
//faces = detector(cimg);
dets = detector(cimg);
target = dets.size() > max_target ? max_target : dets.size();
for (int i = 0; i < target; i++) {
vecTracker[i].start_track(cimg, dlib::centered_rect((dets[i].right() + dets[i].left()) / 2, (dets[i].top() + dets[i].bottom()) / 2, dets[i].width(), dets[i].height()));
}
for (int i = 0; i < max_target; i++) {
temp_dets[i] = track_dets[i]; //缓存历史数据
//清空目标容器数据
track_dets[i].rc = { 0,0,0,0 };
track_dets[i].strConfidence = "";
track_dets[i].bSuccess = false;
track_dets[i].strName = "";
track_dets[i].strPhone = "";
track_dets[i].iCode = 0;
}
bTargetUpdate = true;
}
//每6帧更新跟踪目标
if (frame_count % 1 == 0) {
for (int i = 0; i < target; i++) {
vecTracker[i].update(cimg);
dlib::rectangle new_position= vecTracker[i].get_position();
//查询当前目标是否已存在
if (bTargetUpdate) {
bool bTargetFind = false; //目标是否已存在
for (auto rcTarget : temp_dets) {
if (abs(rcTarget.rc.left() - new_position.left()) < 50 && abs(rcTarget.rc.top() - new_position.top()) < 50) {
cout << "name:" << rcTarget.strName.data() << endl;
track_dets[i] = rcTarget;
bTargetFind = true;
}
}
if (!bTargetFind || !track_dets[i].bSuccess) {
track_dets[i].rc = new_position;
track_dets[i].iCode = iReqServerCount;
//启动查询线程,查询用户信息
std::string strPathImg = strFilePath+"tempimg"+ to_string(i)+".jpg";
cout << "path:" << strPathImg.data() << endl;
_save_target_img(temp, new_position, strPathImg.data());
//查询提交到线程池
pool.commit(reqUserInfoByImg, iReqServerCount, strPathImg);
cout << "iReqServerCount:" << iReqServerCount << endl;
iReqServerCount++;
}
}
else {
//防抖(位移超过10像素时才更新位置)
int moveSize = abs(track_dets[i].rc.left() - vecTracker[i].get_position().left());
if (moveSize> 10) {
track_dets[i].rc = new_position;
}
}
}
}
bTargetUpdate = false;
// Work out the framerate // Work out the framerate
if (frame_count % 10 == 0) if (iframe % 10 == 0)
{ {
t1 = cv::getTickCount(); time_end = cv::getTickCount();
fps = 10.0 / (double(t1 - t0) / cv::getTickFrequency()); fps = 10.0 / (double(time_end - time_start) / cv::getTickFrequency());
t0 = t1; time_start = time_end;
} }
// Write out the framerate on the image before displaying it std::string strFps = "帧率: " + to_string(fps);
char fpsC[255]; text.putText(&IplImage(image), strFps.data(), cv::Point(10, 20), CV_RGB(255, 0, 0));
sprintf(fpsC, "%d", (int)fps);
string fpsSt("FPS:");
fpsSt += fpsC;
cv::putText(temp, fpsSt, cv::Point(10, 20), CV_FONT_HERSHEY_SIMPLEX, 0.5, CV_RGB(255, 0, 0), 1, CV_AA);
char active_m_C[255]; std::string active_models = "活跃目标: " + to_string(target);
sprintf(active_m_C, "%d", target); text.putText(&IplImage(image), active_models.data(), cv::Point(10, 50), CV_RGB(255, 0, 0));
string active_models_st("Active models:");
active_models_st += active_m_C;
cv::putText(temp, active_models_st, cv::Point(10, 60), CV_FONT_HERSHEY_SIMPLEX, 0.5, CV_RGB(255, 0, 0), 1, CV_AA);
for (int i = 0; i < target; i++) { for (int i = 0; i < target; i++) {
text.putText(&IplImage(temp), track_dets[i].strName.data(), cvPoint(track_dets[i].rc.right() + 5, track_dets[i].rc.top() + 15), CV_RGB(255, 0, 0)); text.putText(&IplImage(image), track_dets[i].strName.data(), cvPoint(track_dets[i].rc.right() + 5, track_dets[i].rc.top() + 15), CV_RGB(255, 0, 0));
text.putText(&IplImage(temp), track_dets[i].strPhone.data(), cvPoint(track_dets[i].rc.right() + 5, track_dets[i].rc.top() + 50), CV_RGB(255, 0, 0)); text.putText(&IplImage(image), track_dets[i].strPhone.data(), cvPoint(track_dets[i].rc.right() + 5, track_dets[i].rc.top() + 45), CV_RGB(255, 0, 0));
text.putText(&IplImage(temp), track_dets[i].strConfidence.data(), cvPoint(track_dets[i].rc.right() + 5, track_dets[i].rc.top() + 85), CV_RGB(255, 0, 0)); text.putText(&IplImage(image), track_dets[i].strConfidence.data(), cvPoint(track_dets[i].rc.right() + 5, track_dets[i].rc.top() + 75), CV_RGB(255, 0, 0));
} }
// Display it all on the screen
//win.set_size(800, 600);
win.clear_overlay();
win.set_image(cimg);
win.add_overlay(_get_rc_detectors(track_dets), dlib::rgb_pixel(0, 255, 0));
//cout << "frame:" << frame_count << endl;
//计数超过10000,计数归零
if (frame_count > 10000)
frame_count = 0;
//Sleep(50);
}
}
catch (dlib::serialization_error& e)
{
cout << "You need dlib's default face landmarking model file to run this example." << endl;
cout << "You can get it from the following URL: " << endl;
cout << " http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2" << endl;
cout << endl << e.what() << endl;
}
catch (exception& e)
{
cout << e.what() << endl;
}
// global release
curl_global_cleanup();
return 0;
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment