1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
// Copyright (C) 2014 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#ifndef DLIB_RENDER_FACE_DeTECTIONS_H_
#define DLIB_RENDER_FACE_DeTECTIONS_H_
#include "full_object_detection.h"
#include "../gui_widgets.h"
#include "render_face_detections_abstract.h"
#include <vector>
namespace dlib
{
inline std::vector<image_window::overlay_line> render_face_detections (
const std::vector<full_object_detection>& dets,
const rgb_pixel color = rgb_pixel(0,255,0)
)
{
std::vector<image_window::overlay_line> lines;
for (unsigned long i = 0; i < dets.size(); ++i)
{
DLIB_CASSERT(dets[i].num_parts() == 68 || dets[i].num_parts() == 5,
"\t std::vector<image_window::overlay_line> render_face_detections()"
<< "\n\t You have to give either a 5 point or 68 point face landmarking output to this function. "
<< "\n\t dets["<<i<<"].num_parts(): " << dets[i].num_parts()
);
const full_object_detection& d = dets[i];
if (d.num_parts() == 5)
{
lines.push_back(image_window::overlay_line(d.part(0), d.part(1), color));
lines.push_back(image_window::overlay_line(d.part(1), d.part(4), color));
lines.push_back(image_window::overlay_line(d.part(4), d.part(3), color));
lines.push_back(image_window::overlay_line(d.part(3), d.part(2), color));
}
else
{
// Around Chin. Ear to Ear
for (unsigned long i = 1; i <= 16; ++i)
lines.push_back(image_window::overlay_line(d.part(i), d.part(i-1), color));
// Line on top of nose
for (unsigned long i = 28; i <= 30; ++i)
lines.push_back(image_window::overlay_line(d.part(i), d.part(i-1), color));
// left eyebrow
for (unsigned long i = 18; i <= 21; ++i)
lines.push_back(image_window::overlay_line(d.part(i), d.part(i-1), color));
// Right eyebrow
for (unsigned long i = 23; i <= 26; ++i)
lines.push_back(image_window::overlay_line(d.part(i), d.part(i-1), color));
// Bottom part of the nose
for (unsigned long i = 31; i <= 35; ++i)
lines.push_back(image_window::overlay_line(d.part(i), d.part(i-1), color));
// Line from the nose to the bottom part above
lines.push_back(image_window::overlay_line(d.part(30), d.part(35), color));
// Left eye
for (unsigned long i = 37; i <= 41; ++i)
lines.push_back(image_window::overlay_line(d.part(i), d.part(i-1), color));
lines.push_back(image_window::overlay_line(d.part(36), d.part(41), color));
// Right eye
for (unsigned long i = 43; i <= 47; ++i)
lines.push_back(image_window::overlay_line(d.part(i), d.part(i-1), color));
lines.push_back(image_window::overlay_line(d.part(42), d.part(47), color));
// Lips outer part
for (unsigned long i = 49; i <= 59; ++i)
lines.push_back(image_window::overlay_line(d.part(i), d.part(i-1), color));
lines.push_back(image_window::overlay_line(d.part(48), d.part(59), color));
// Lips inside part
for (unsigned long i = 61; i <= 67; ++i)
lines.push_back(image_window::overlay_line(d.part(i), d.part(i-1), color));
lines.push_back(image_window::overlay_line(d.part(60), d.part(67), color));
}
}
return lines;
}
// ----------------------------------------------------------------------------------------
inline std::vector<image_window::overlay_line> render_face_detections (
const full_object_detection& det,
const rgb_pixel color = rgb_pixel(0,255,0)
)
{
std::vector<full_object_detection> dets;
dets.push_back(det);
return render_face_detections(dets, color);
}
// ----------------------------------------------------------------------------------------
}
#endif // DLIB_RENDER_FACE_DeTECTIONS_H_
|