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
|
/* Copyright (c) 2012 Patrick Ruoff
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* 20130312, WVR: Add 7 lines to resizeGL after resize_frame. This should lower CPU-load.
*/
#include "video_widget.h"
#include <QDebug>
#include <QHBoxLayout>
using namespace cv;
using namespace std;
#ifndef OPENTRACK_API
using namespace boost;
#endif
#ifndef OPENTRACK_API
// ----------------------------------------------------------------------------
void VideoWidget::initializeGL()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void VideoWidget::resizeGL(int w, int h)
{
// setup 1 to 1 projection
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, 0, h, -1, 1);
resize_frame();
glDisable(GL_DEPTH_TEST);
glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(1,0);
glVertex2f(1,1);
glVertex2f(0,1);
glEnd();
}
void VideoWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
if (!resized_qframe.isNull())
{
glDrawPixels(resized_qframe.width(), resized_qframe.height(), GL_RGBA, GL_UNSIGNED_BYTE, resized_qframe.bits());
const int crosshair_radius = 10;
const int crosshair_thickness = 1;
if (points)
{
glColor3f(1.0, 0.0, 0.0);
glLineWidth(crosshair_thickness);
int x,y;
for (vector<Vec2f>::iterator iter = points->begin();
iter != points->end();
++iter)
{
x = (*iter)[0] * resized_qframe.width() + resized_qframe.width()/2.0 + 0.5;
y = (*iter)[1] * resized_qframe.width() + resized_qframe.height()/2.0 + 0.5;
glBegin(GL_LINES);
glVertex2i(x-crosshair_radius, y);
glVertex2i(x+crosshair_radius, y);
glEnd();
glBegin(GL_LINES);
glVertex2i(x, y-crosshair_radius);
glVertex2i(x, y+crosshair_radius);
glEnd();
}
}
}
glFlush();
}
void VideoWidget::resize_frame()
{
if (!qframe.isNull())
resized_qframe = qframe.scaled(this->size(), Qt::KeepAspectRatio);
}
void VideoWidget::update_frame_and_points()
{
if (!get_frame_and_points(frame, points)) return;
// convert to QImage
if (frame.channels() == 3)
qframe = QImage((const unsigned char*)(frame.data), frame.cols, frame.rows, frame.step, QImage::Format_RGB888).rgbSwapped();
else if (frame.channels() == 1)
qframe = QImage((const unsigned char*)(frame.data), frame.cols, frame.rows, frame.step, QImage::Format_Indexed8);
qframe = QGLWidget::convertToGLFormat(qframe);
resize_frame();
updateGL();
}
#else
void VideoWidget2::update_image(const cv::Mat& frame)
{
QMutexLocker foo(&mtx);
QImage qframe = QImage(frame.cols, frame.rows, QImage::Format_RGB888);
uchar* data = qframe.bits();
const int pitch = qframe.bytesPerLine();
for (int y = 0; y < frame.rows; y++)
for (int x = 0; x < frame.cols; x++)
{
const int pos = 3 * (y*frame.cols + x);
data[y * pitch + x * 3 + 0] = frame.data[pos + 2];
data[y * pitch + x * 3 + 1] = frame.data[pos + 1];
data[y * pitch + x * 3 + 2] = frame.data[pos + 0];
}
qframe = qframe.scaled(size(), Qt::IgnoreAspectRatio, Qt::FastTransformation);
pixmap = QPixmap::fromImage(qframe);
}
#endif
// ----------------------------------------------------------------------------
VideoWidgetDialog::VideoWidgetDialog(QWidget *parent, FrameProvider* provider)
: QDialog(parent),
video_widget(NULL)
{
const int VIDEO_FRAME_WIDTH = 640;
const int VIDEO_FRAME_HEIGHT = 480;
#ifdef OPENTRACK_API
video_widget = new VideoWidget2(this, provider);
#else
video_widget = new VideoWidget(this, provider);
#endif
QHBoxLayout* layout = new QHBoxLayout();
layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(video_widget);
if (this->layout()) delete this->layout();
setLayout(layout);
resize(VIDEO_FRAME_WIDTH, VIDEO_FRAME_HEIGHT);
}
|