-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathWindow.cpp
129 lines (101 loc) · 3.46 KB
/
Window.cpp
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "Window.hpp"
#include <sstream>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "ext/opencv.hpp"
#include "Pulse.hpp"
#include "profiler/Profiler.h"
using std::stringstream;
using namespace cv;
Window::Window(Pulse& pulse) :
pulse(pulse),
WINDOW_NAME("EVM"),
TRACKBAR_FACE_DETECTION_NAME("Face Detection"),
TRACKBAR_MAGNIFY_NAME ("Magnify "),
TRACKBAR_ALPHA_NAME ("Amplification ")
{
trackbarFaceDetection = pulse.faceDetection.enabled;
trackbarMagnify = pulse.evm.magnify;
trackbarAlpha = pulse.evm.alpha;
namedWindow(WINDOW_NAME);
createTrackbar(TRACKBAR_FACE_DETECTION_NAME, WINDOW_NAME, &trackbarFaceDetection, 1);
createTrackbar(TRACKBAR_MAGNIFY_NAME, WINDOW_NAME, &trackbarMagnify, 1);
createTrackbar(TRACKBAR_ALPHA_NAME, WINDOW_NAME, &trackbarAlpha, 500);
fpsPoint = Point(10, 15);
}
Window::~Window() {
}
void Window::update(Mat& frame) {
PROFILE_SCOPED();
// update pulse values for Eulerian video magnification
pulse.faceDetection.enabled = trackbarFaceDetection == 1;
pulse.evm.magnify = trackbarMagnify == 1;
pulse.evm.alpha = trackbarAlpha;
PROFILE_START_DESC("bgr2rgb");
cvtColor(frame, frame, CV_BGR2RGB);
PROFILE_STOP();
// process frame
pulse.onFrame(frame);
drawTrackbarValues(frame);
drawFps(frame);
PROFILE_START_DESC("rgb2bgr");
cvtColor(frame, frame, CV_RGB2BGR);
PROFILE_STOP();
PROFILE_START_DESC("imshow");
imshow(WINDOW_NAME, frame);
PROFILE_STOP();
}
void Window::drawTrackbarValues(Mat& frame) {
PROFILE_SCOPED();
const int namesX = 10;
const int valuesX = 150;
const int spaceY = 15;
stringstream ss;
putText(frame, TRACKBAR_FACE_DETECTION_NAME, Point( namesX, spaceY * 2), FONT_HERSHEY_PLAIN, 1, BLUE);
putText(frame, (trackbarFaceDetection == 1 ? "ON" : "OFF"), Point(valuesX, spaceY * 2), FONT_HERSHEY_PLAIN, 1, BLUE);
putText(frame, TRACKBAR_MAGNIFY_NAME, Point( namesX, spaceY * 3), FONT_HERSHEY_PLAIN, 1, BLUE);
putText(frame, (trackbarMagnify == 1 ? "ON" : "OFF"), Point(valuesX, spaceY * 3), FONT_HERSHEY_PLAIN, 1, BLUE);
ss.str("");
ss << trackbarAlpha;
putText(frame, TRACKBAR_ALPHA_NAME, Point( namesX, spaceY * 4), FONT_HERSHEY_PLAIN, 1, BLUE);
putText(frame, ss.str(), Point(valuesX, spaceY * 4), FONT_HERSHEY_PLAIN, 1, BLUE);
}
void Window::drawFps(Mat& frame) {
PROFILE_SCOPED();
if (fps.update()) {
PROFILE_SCOPED_DESC("fps string");
stringstream ss;
ss.precision(3);
ss << "FPS: " << fps.fps;
fpsString = ss.str();
}
PROFILE_START_DESC("fps drawing");
putText(frame, fpsString, fpsPoint, FONT_HERSHEY_PLAIN, 1, BLUE);
PROFILE_STOP();
}
Window::Fps::Fps() {
deltaFrames = 30;
currentFrame = 0;
lastFrame = 0;
lastFpsTime = 0;
fps = 0;
}
bool Window::Fps::update() {
PROFILE_SCOPED();
if (currentFrame == 0) {
lastFpsTime = (double)getTickCount();
}
currentFrame++;
if (currentFrame % 30 == 0) {
PROFILE_SCOPED_DESC("fps tick");
double now = (double)getTickCount();
double diff = (now - lastFpsTime) * 1000. / getTickFrequency();
if (diff > 0) {
fps = (currentFrame - lastFrame) * 1000 / diff;
lastFrame = currentFrame;
lastFpsTime = now;
return true;
}
}
return false;
}