-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathVideoWidget.cpp
More file actions
executable file
·155 lines (128 loc) · 3.25 KB
/
VideoWidget.cpp
File metadata and controls
executable file
·155 lines (128 loc) · 3.25 KB
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <QtGui>
#include "VideoWidget.h"
#include <ctime>
#include <sstream>
// Live mode constructor
VideoWidget::VideoWidget(int dev, int fps, int width, int height) {
liveMode = true;
//camera.open("dev.avi");
camera.open(dev);
// delete later
//setFixedSize(width, height);
time_t t = std::time(0); // get time now
struct tm * now = localtime( & t );
int day = (now->tm_mday);
int month = (now->tm_mon + 1);
int year = (now->tm_year + 1900);
std::ostringstream oss;
oss << dev;
oss << "_";
if (day < 10)
oss << "0";
oss << day;
if (month < 10)
oss << "0";
oss << month;
oss << year;
string filename = "sur_" + oss.str() + ".avi";
// Open a writer to save the live feed
writer.open(filename, //filename
CV_FOURCC('P','I','M','1'), //codec
20, //fps
Size(width, height), //size
true); // color
timerId = 0;
frameRate = fps;
}
// History mode constructor
VideoWidget::VideoWidget(int dev, string date, int width, int height) {
liveMode = false;
std::ostringstream oss;
oss << dev;
oss << "_";
oss << date;
readFilename = "sur_" + oss.str() + ".avi";
playback.open(readFilename);
frameCount = 0;
timerId = 0;
frameRate = 20;
}
VideoWidget::~VideoWidget() {
camera.release();
writer.release();
playback.release();
}
void VideoWidget::showEvent(QShowEvent *event)
{
nframes = 0; // init
timerId = startTimer(1000 / frameRate); // in msec
time.start(); // start time
}
void VideoWidget::hideEvent(QHideEvent *event) {
//killTimer(timerId);
}
void VideoWidget::timerEvent(QTimerEvent *event) {
if (event->timerId() == timerId) {
Mat frame;
if (liveMode == true) {
frame = captureFrame();
} else {
frame = playFrame();
if (frameCount < playback.get(CV_CAP_PROP_POS_FRAMES)) {
frameCount = playback.get(CV_CAP_PROP_POS_FRAMES);
} else {
//setPlaybackFrame(1);
playback.open(readFilename);
frameCount = 0;
}
//qDebug() << frameCount;
}
if (frame.empty() == false) {
QImage image = getQImageFromFrame(frame);
pixmap = QPixmap::fromImage(image);
repaint();
}
if (++nframes == frameRate*2) {
qDebug("frame rate: %f", (float)nframes * 1000 / time.elapsed());
nframes = 0;
time.restart();
}
} else {
QWidget::timerEvent(event);
}
}
void VideoWidget::paintEvent(QPaintEvent *event) {
QRectF rect = QRectF(QPoint(), size());
QPainter painter(this);
painter.drawPixmap(rect, pixmap, rect);
}
Mat VideoWidget::captureFrame() {
Mat frame;
if (camera.isOpened())
camera.read(frame);
else
qDebug("Camera not initialized properly!");
flip(frame, frame, 1); // mirror flip the image, as there is a problem with capturing
saveFrame(frame);
return frame;
}
QImage VideoWidget::getQImageFromFrame(Mat frame) {
QImage img = QImage((uchar*) frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888);
return img.rgbSwapped();
}
void VideoWidget::saveFrame(Mat frame) {
writer.write(frame);
}
Mat VideoWidget::playFrame() {
Mat frame;
if (playback.isOpened()) {
playback.read(frame);
} else {
qDebug("Playback not initialized properly!");
}
return frame;
}
void VideoWidget::setPlaybackFrame(int index) {
//qDebug() << index;
//qDebug() << playback.set(CV_CAP_PROP_POS_AVI_RATIO, 0);
}