Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
F
FaceDetection
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
guanghui.cui
FaceDetection
Commits
54f9efee
Commit
54f9efee
authored
Feb 23, 2018
by
guanghui.cui
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
代码结构调整
parent
e3017f8f
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
198 additions
and
191 deletions
+198
-191
FaceDetection/FaceDetection.cpp
+198
-191
No files found.
FaceDetection/FaceDetection.cpp
View file @
54f9efee
...
@@ -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
()
+
8
5
),
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
()
+
7
5
),
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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment