ROV'NET  0.2
BTS SNIR LaSalle Avignon 2020
camera.cpp
Aller à la documentation de ce fichier.
1 
7 #include "camera.h"
8 #include <QApplication>
9 #include <QDesktopWidget>
10 #include <QMediaRecorder>
11 
12 Camera::Camera(Rov *rov, int numero, int choixResolution): rov(rov), numero(numero), largeur(LARGEUR_DEFAUT), hauteur(HAUTEUR_DEFAUT), luminosite(SEUIL_DEFAUT), contraste(SEUIL_DEFAUT), saturation(SEUIL_DEFAUT), changementProprietes(false), choixResolution(choixResolution)
13 {
14  #if CV_VERSION_MAJOR == 3
15  qDebug() << Q_FUNC_INFO << "OpenCV" << CV_VERSION_MAJOR << CV_VERSION_MINOR;
16  #else
17  qDebug() << Q_FUNC_INFO << "OpenCV" << CV_MAJOR_VERSION << CV_MINOR_VERSION;
18  #endif
19 
21 
24  if(choixResolution == -1)
26  else
27  setResolution(choixResolution);
28  qDebug() << Q_FUNC_INFO << this;
29  qDebug() << Q_FUNC_INFO << "numero" << numero << "nomCamera" << nomCamera;
30  qDebug() << Q_FUNC_INFO << "largeur" << largeur << "hauteur" << hauteur;
31  qDebug() << Q_FUNC_INFO << "luminosite" << luminosite << "contraste" << contraste << "saturation" << saturation;
32 }
33 
34 Camera::Camera(Rov *rov, QString nomCamera, int choixResolution): rov(rov), nomCamera(nomCamera), largeur(LARGEUR_DEFAUT), hauteur(HAUTEUR_DEFAUT), luminosite(SEUIL_DEFAUT), contraste(SEUIL_DEFAUT), saturation(SEUIL_DEFAUT), changementProprietes(false), choixResolution(choixResolution)
35 {
36  #if CV_VERSION_MAJOR == 3
37  qDebug() << Q_FUNC_INFO << "OpenCV" << CV_VERSION_MAJOR << CV_VERSION_MINOR;
38  #else
39  qDebug() << Q_FUNC_INFO << "OpenCV" << CV_MAJOR_VERSION << CV_MINOR_VERSION;
40  #endif
41 
43 
44  numero = Camera::extraireNumero(nomCamera);
45 
47  if(choixResolution == -1)
49  else
50  setResolution(choixResolution);
51 
52  qDebug() << Q_FUNC_INFO << this;
53  qDebug() << Q_FUNC_INFO << "numero" << numero << "nomCamera" << nomCamera;
54  qDebug() << Q_FUNC_INFO << "largeur" << largeur << "hauteur" << hauteur;
55  qDebug() << Q_FUNC_INFO << "luminosite" << luminosite << "contraste" << contraste << "saturation" << saturation;
56 }
57 
59 {
60  qDebug() << Q_FUNC_INFO << this;
61 }
62 
63 void Camera::acquerirImageVideo(cv::VideoCapture &camera, cv::Mat &frame)
64 {
65  camera >> frame;
66 }
67 
69 {
70  qDebug() << Q_FUNC_INFO << "start" << "numero" << numero << "nomCamera" << nomCamera;
71  this->setPriority(QThread::NormalPriority);
72 
73  if(numero < 0)
74  {
75  qDebug() << Q_FUNC_INFO << "Erreur numero" << numero << "nomCamera" << nomCamera;
76  return;
77  }
78 
79  cv::VideoCapture camera(numero);
80  cv::Mat frame;
81 
82  setProprietes(camera);
83 
84  while(camera.isOpened() && !isInterruptionRequested())
85  {
86  acquerirImageVideo(camera, frame);
87  if(frame.empty())
88  continue;
89 
90  QPixmap pixmap = QPixmap::fromImage(QImage(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888).rgbSwapped());
91  emit nouvelleImage(pixmap);
92 
94  setProprietes(camera);
95  }
96 
97  camera.release();
98  qDebug() << Q_FUNC_INFO << "stop" << "numero" << numero << "nomCamera" << nomCamera;
99 
100  emit finVideo();
101 }
102 
103 QString Camera::getNom() const
104 {
105  return nomCamera;
106 }
107 
108 void Camera::setProprietes(cv::VideoCapture &camera)
109 {
110  qDebug() << Q_FUNC_INFO << "largeur" << largeur << "hauteur" << hauteur;
111  camera.set(CV_CAP_PROP_FRAME_WIDTH, largeur);
112  camera.set(CV_CAP_PROP_FRAME_HEIGHT, hauteur);
113 
114  qDebug() << Q_FUNC_INFO << "luminosite" << luminosite << "contraste" << contraste << "saturation" << saturation;
115  camera.set(CV_CAP_PROP_BRIGHTNESS, luminosite);
116  camera.set(CV_CAP_PROP_CONTRAST, contraste);
117  camera.set(CV_CAP_PROP_SATURATION, saturation);
118 
119  changementProprietes = false;
120 }
121 
123 {
124  if(choixResolution != -1)
126  return QSize(LARGEUR_DEFAUT,HAUTEUR_DEFAUT);
127 }
128 
130 {
131  return choixResolution;
132 }
133 
135 {
136  QCameraInfo cameraInfo(nomCamera.toLatin1());
138 }
139 
141 {
142  QString nom = Camera::creerNomCamera(numero);
143  QCameraInfo cameraInfo(nom.toLatin1());
145 }
146 
148 {
149  QCameraInfo cameraInfo(nomCamera.toLatin1());
151 }
152 
153 void Camera::recupererListeResolutionsCamera(QCameraInfo &cameraInfo)
154 {
155  #ifndef SANS_DETECTION
156  listeResolutionsCamera.clear();
157  if(QCameraInfo::availableCameras().count() > 0)
158  {
159  QCamera *camera = new QCamera(cameraInfo, this);
160  QMediaRecorder *mediaRecorder = new QMediaRecorder(camera, this);
161  camera->load();
162  qDebug() << Q_FUNC_INFO << this << mediaRecorder->supportedResolutions().size();
163  if(mediaRecorder->supportedResolutions().size() > 0)
164  {
165  foreach (const QSize &resolution, mediaRecorder->supportedResolutions())
166  {
167  qDebug() << Q_FUNC_INFO << resolution.width() << "x" << resolution.height();
168  listeResolutionsCamera.push_back(resolution);
169  }
170  }
171  delete mediaRecorder;
172  delete camera;
173  }
174  #else
175  Q_UNUSED(cameraInfo);
176  listeResolutionsCamera.clear();
177  QSize resolutionDefaut(LARGEUR_DEFAUT, HAUTEUR_DEFAUT);
178  listeResolutionsCamera.push_back(resolutionDefaut);
179  #endif
180 }
181 
183 {
184  return listeResolutionsCamera;
185 }
186 
188 {
189  qDebug() << Q_FUNC_INFO << "largeur" << largeur << "hauteur" << hauteur;
190  QSize size(largeur, hauteur);
191  int i = listeResolutionsCamera.indexOf(size);
192  if (i != -1)
193  {
194  choixResolution = i;
195  this->largeur = largeur;
196  this->hauteur = hauteur;
197  changementProprietes = true;
198  }
199  else
200  {
201  size = listeResolutionsCamera.last();
202  choixResolution = listeResolutionsCamera.indexOf(size);;
203  this->largeur = size.width();
204  this->hauteur = size.height();
205  changementProprietes = true;
206  }
207  qDebug() << Q_FUNC_INFO << "largeur" << this->largeur << "hauteur" << this->hauteur << "choixResolution" << choixResolution;
208 }
209 
210 void Camera::setResolution(QSize resolution)
211 {
212  qDebug() << Q_FUNC_INFO << "largeur" << resolution.width() << "hauteur" << resolution.height();
213  int i = listeResolutionsCamera.indexOf(resolution);
214  if (i != -1)
215  {
216  choixResolution = i;
217  this->largeur = resolution.width();
218  this->hauteur = resolution.height();
219  changementProprietes = true;
220  }
221  else
222  {
223  QSize size = listeResolutionsCamera.last();
224  choixResolution = listeResolutionsCamera.indexOf(size);;
225  this->largeur = size.width();
226  this->hauteur = size.height();
227  changementProprietes = true;
228  }
229  qDebug() << Q_FUNC_INFO << "largeur" << this->largeur << "hauteur" << this->hauteur << "choixResolution" << choixResolution;
230 }
231 
232 void Camera::setResolution(int choix)
233 {
234  qDebug() << Q_FUNC_INFO << "choix" << choix;
235  if(choix < listeResolutionsCamera.size())
236  {
237  choixResolution = choix;
238  this->largeur = listeResolutionsCamera.at(choix).width();
239  this->hauteur = listeResolutionsCamera.at(choix).height();
240  changementProprietes = true;
241  }
242  else
243  {
244  QSize size = listeResolutionsCamera.last();
245  choixResolution = listeResolutionsCamera.indexOf(size);;
246  this->largeur = size.width();
247  this->hauteur = size.height();
248  changementProprietes = true;
249  }
250  qDebug() << Q_FUNC_INFO << "largeur" << this->largeur << "hauteur" << this->hauteur << "choixResolution" << choixResolution;
251 }
252 
254 {
255  this->luminosite = double(luminosite)/100;
256  changementProprietes = true;
257 }
258 
260 {
261  this->contraste = double(contraste)/100;
262  changementProprietes = true;
263 }
264 
266 {
267  this->saturation = double(saturation)/100;
268  changementProprietes = true;
269 }
270 
272 {
273  qDebug() << Q_FUNC_INFO << "Caméra(s) disponible(s)" << QCameraInfo::availableCameras().count();
274  return QCameraInfo::availableCameras().count();
275 }
276 
278 {
279  int numero = -1;
280  QString video = "/dev/video";
281 
282  if(nomCamera.contains(video))
283  {
284  QString n = nomCamera.mid(video.length(), nomCamera.length());
285  bool ok;
286  qDebug() << Q_FUNC_INFO << "nom" << nomCamera << "n" << nomCamera.right(nomCamera.indexOf("/dev/video")) << "index" << nomCamera.indexOf("/dev/video");
287  numero = n.toInt(&ok);
288  if(ok)
289  return numero;
290  }
291  return numero;
292 }
293 
295 {
296  QString nom;
297 
298  if(numero >= 0)
299  {
300  nom = QString("/dev/video") + QString::number(numero);
301  }
302  return nom;
303 }
304 
305 QList<QSize> Camera::lireListeResolutionsCamera(QCameraInfo &cameraInfo)
306 {
307  QList<QSize> listeResolutions;
308  listeResolutions.clear();
309  if(QCameraInfo::availableCameras().count() > 0)
310  {
311  QCamera *camera = new QCamera(cameraInfo);
312  QMediaRecorder *mediaRecorder = new QMediaRecorder(camera);
313  camera->load();
314  qDebug() << Q_FUNC_INFO << mediaRecorder->supportedResolutions().size();
315  if(mediaRecorder->supportedResolutions().size() > 0)
316  {
317  foreach (const QSize &resolution, mediaRecorder->supportedResolutions())
318  {
319  qDebug() << Q_FUNC_INFO << resolution.width() << "x" << resolution.height();
320  listeResolutions.push_back(resolution);
321  }
322  }
323  delete mediaRecorder;
324  delete camera;
325  }
326  return listeResolutions;
327 }
Camera(Rov *rov, int numero, int choixResolution=-1)
Constructeur de la classe Camera.
Definition: camera.cpp:12
QString getNom() const
Retourne le nom de la caméra.
Definition: camera.cpp:103
int numero
Attribut contenant le numéro de la caméra sélectionnée.
Definition: camera.h:64
void acquerirImageVideo(cv::VideoCapture &camera, cv::Mat &frame)
Fait l&#39;acquisition d&#39;une nouvelle frame.
Definition: camera.cpp:63
int getChoixResolution()
Récupère le choix de la resolution active.
Definition: camera.cpp:129
static int extraireNumero(QString nomCamera)
Retourne le numéro de caméra associé a son nom.
Definition: camera.cpp:277
void nouvelleImage(QPixmap image)
Envoie un signal lorsque une nouvelle image du flux vidéo est disponible.
QList< QSize > getListeResolutionsCamera()
Retourne la liste des résolutions supportées par la caméra.
Definition: camera.cpp:182
QList< QSize > listeResolutionsCamera
Liste contenant les résolutions supportés par la caméra.
Definition: camera.h:71
Fichier qui contient la déclaration de la classe Camera.
QString nomCamera
Attribut contenant le nom de la caméra sélectionnée.
Definition: camera.h:63
#define SEUIL_DEFAUT
Défini le seuil du contraste, luminosite et saturation de la caméra par défaut.
Definition: camera.h:47
void setResolution(int largeur, int hauteur)
Modifie la résolution (largeur x hauteur)
Definition: camera.cpp:187
double luminosite
Attribut contenant la luminosite de la vidéo.
Definition: camera.h:67
void setProprietes(cv::VideoCapture &camera)
Après l&#39;acquisition d&#39;une nouvelle frame modifie les propriété de la caméra si ceux-ci ont été modifi...
Definition: camera.cpp:108
void setContraste(int contraste)
Modifie le contraste de la caméra.
Definition: camera.cpp:259
Classe controlant tout les traitements en provenance et en direction de la communication avec le rov...
Definition: rov.h:91
int choixResolution
Choix dans la liste contenant les résolutions supportés par la caméra.
Definition: camera.h:72
void run()
Démarre une nouveau thread afin de capturer le flux video et l&#39;envoyer à l&#39;IHM.
Definition: camera.cpp:68
#define HAUTEUR_DEFAUT
Défini la hauteur en pixel de la caméra par défaut.
Definition: camera.h:41
void setSaturation(int saturation)
Modifie la saturation de la caméra.
Definition: camera.cpp:265
bool changementProprietes
Attribut désignant si une propriete de la caméra doit être modifiée.
Definition: camera.h:70
static QList< QSize > lireListeResolutionsCamera(QCameraInfo &cameraInfo)
Retourne la liste des résolutions supportés par la caméra passé en parametre.
Definition: camera.cpp:305
void setLuminosite(int luminosite)
Modifie la luminosite de la caméra.
Definition: camera.cpp:253
double contraste
Attribut contenant le constraste de la vidéo.
Definition: camera.h:68
QSize getResolution()
Récupère la resolution active.
Definition: camera.cpp:122
#define LARGEUR_DEFAUT
Défini la largeur en pixel de la caméra par défaut.
Definition: camera.h:35
void finVideo()
Envoie un signal lorsque la vidéo est interrompu.
int hauteur
Attribut contenant la hauteur (heigth) en pixels de la vidéo.
Definition: camera.h:66
int largeur
Attribut contenant la largeur (width) en pixels de la vidéo.
Definition: camera.h:65
~Camera()
Destructeur de la classe Camera.
Definition: camera.cpp:58
void recupererListeResolutionsCamera()
Récupère la liste des résolutions supportées par la caméra sélectionnée.
Definition: camera.cpp:134
static int getNbCameras()
Retourne le nombre de caméras connectés.
Definition: camera.cpp:271
static QString creerNomCamera(int numero)
Retourne le nom de caméra associé a son numéro.
Definition: camera.cpp:294
double saturation
Attribut contenant la saturation de la vidéo.
Definition: camera.h:69
Rov * rov
Objet rov permettant de récuperer les dernière mesures issues des capteurs.
Definition: camera.h:62