-
Notifications
You must be signed in to change notification settings - Fork 1
/
imageviewerwindow.cpp
212 lines (171 loc) · 5.97 KB
/
imageviewerwindow.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
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#include "imageviewerwindow.h"
#include "ui_imageviewerwindow.h"
#include <QFileDialog>
#include <QMovie>
#include <QMessageBox>
#include <QDebug>
#include <QSettings>
#include <QPixmap>
#include <QImage>
#include <QPainter>
#include <opencv2/opencv.hpp>
#include <QIODevice>
#include "protocol.pb.h"
#include <ctime>
#include <QTimer>
ImageViewerWindow::ImageViewerWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::ImageViewerWindow)
{
ui->setupUi(this);
// Registra QVector<QRect> como tipo en qt para reconocerlo al hacer connect
qRegisterMetaType< QVector<QRect> >("QVector<QRect>");
// Capturar la imagen cuando cambia en el video
QObject::connect(&video,SIGNAL(updated(const QRect&)),
this,SLOT(on_movie_updated(const QRect&)));
// Pasar la petición de procesar el frame
QObject::connect(this, SIGNAL(Procesar_Imagen(const QImage &)),
&imageProcesor_, SLOT(Procesador_imagen(const QImage &)));
// Ser notificado cuando el frame ha sido procesado
QObject::connect(&imageProcesor_, SIGNAL(Mandar_imagen(const QImage &,const QVector<QRect> &)),
this, SLOT(envio_paquete(const QImage &,const QVector<QRect> &)));
// Migrar la instancia de imageProcesor al hilo de trabajo
imageProcesor_.moveToThread(&workingThread_);
// Iniciar el hilo de trabajo
workingThread_.start();
//CONFIGURACION DEL SOCKET USANDO QSETTINGS
// Creamos el objeto de acceso a archivo datos
QSettings config("config", QSettings::IniFormat);
puerto = config.value("puerto", "").toInt();
ip = config.value("ip", "").toString();
devicename = config.value("nombre", "").toString();
interval = config.value("reconect_time", "").toInt();
timer.setInterval(interval);
qDebug() << puerto << " " << ip << " " << devicename;
socket = new QSslSocket(this); //Creamos una instancia del socket ssl.
QObject::connect(socket, SIGNAL(encrypted()), this, SLOT(socket_ready()));
QObject::connect(socket, SIGNAL(disconnected()), this, SLOT(socket_down()));
QObject::connect(socket, SIGNAL(sslErrors(const QList<QSslError>&)),this, SLOT(socket_ssl_error(const QList<QSslError>&)));
QObject::connect(socket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(socketError()));
socket->setProtocol(QSsl::SslV3);
socket->connectToHostEncrypted(ip,puerto);
socket->ignoreSslErrors();
QObject::connect(&timer, SIGNAL(timeout()),this, SLOT(reconnect()));
timer.start();
//FIN DE CONFIGURACIÓN DEL SOCKET.
}
ImageViewerWindow::~ImageViewerWindow()
{
// Le decimos al bucle de mensajes del hilo que se detenga
imageProcesor_.set_cierre(true);
workingThread_.quit();
// Ahora esperamos a que el hilo de trabajo termine
workingThread_.wait();
delete ui;
}
void ImageViewerWindow::on_BtSalir_clicked()
{
qApp->quit();
}
void ImageViewerWindow::on_action_Salir_triggered()
{
qApp->quit();
}
void ImageViewerWindow::on_action_Abrir_triggered()
{
// Abre cuadro de dialogo para escoger archivo y guarda la ruta en filename
QString fileName = QFileDialog::getOpenFileName(this,tr("Open File"),QString(),tr("Video Files (*.mjpeg)"));
if (!fileName.isEmpty())
{
// Para el video
video.stop();
//pone la velocidad de video a 10% sobre el normal para que no falle en el portatil
video.setSpeed(10);
// Pone como nuevo video fileName
video.setFileName(fileName);
// Inicia el video
video.start();
qDebug() << "Inicio de video";
}
}
void ImageViewerWindow::on_movie_updated(const QRect&)
{;
//le manda al hilo la imagen para procesarla
QImage img = video.currentImage();
qDebug() << "Mandando a procesar imagen";
emit Procesar_Imagen(img);
}
void ImageViewerWindow::envio_paquete(const QImage &image,const QVector<QRect> &VRect)
{
paquete msg;
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::ReadWrite);
image.save(&buffer, "jpeg");
std::string img_string(buffer.buffer().data(), buffer.buffer().size());
msg.set_img(img_string);
msg.set_devicename(devicename.toStdString().c_str());
time_t t1 = 0;
time_t* pt1 = &t1;
time(pt1);
msg.set_timestamp(t1);
for (int i=0;i<VRect.size();i++)
{
paquete_rect * r = msg.add_recta();
r->set_x(VRect[i].x());
r->set_y(VRect[i].y());
r->set_width(VRect[i].width());
r->set_height(VRect[i].height());
}
emit socket_write(msg.SerializeAsString());
}
void ImageViewerWindow::socket_ready()
{
qDebug() << "Conexion del socket realizada";
}
void ImageViewerWindow::socket_down()
{
qDebug() << "Desconexion del socket realizada";
}
void ImageViewerWindow::socketError()
{
qDebug() << "Error de conexion de socket: " << socket->errorString();
socket->close();
}
void ImageViewerWindow::socket_ssl_error(const QList<QSslError> &error)
{
QString errorStrings;
for(int i=0;i<error.size();++i)
{
errorStrings += error[i].errorString();
errorStrings += '\n';
}
//Muestra que ha ocurrido un error de certificado
qDebug() << QString("Han ocurrido los siguientes errores de certificación SSL:\n\n%1\n\nContinuar?").arg(errorStrings);
socket->ignoreSslErrors();
}
void ImageViewerWindow::socket_write(std::string msg)
{
if(socket->state() == QAbstractSocket::ConnectedState)
{
int64_t size = msg.size();
socket->write((char*)&size,sizeof(size));
qDebug() << "Tamaño del paquete" << size;
socket->write(msg.c_str(),size);
qDebug() << "Mensaje enviado";
}
else
{
qDebug() << "No se a podido enviar el mensaje";
}
}
void ImageViewerWindow::reconnect()
{
if(socket->state() == QAbstractSocket::UnconnectedState)
{
socket->connectToHostEncrypted(ip,puerto);
socket->ignoreSslErrors();
qDebug() << "Reconectando";
}
timer.start();
}