Hello,
I coded a program to record a video stream under Qt. To respond to my needs, I see your library : OpenCV
I recently had a problem with OpenCV. Indeed, when I run my program in Debug mode, I get the following error: The CDB process terminated.
Here is my program (in French sorry).
/*
Le programme a été crée dans le cadre du projet de BTS SNIR de 2022 : Vidéo tennis (TCT_TV)
Un club de tennis souhaite pouvoir filmer la session de ses adhérents afin de pouvoir ensuite les aider à
progresser. Ceci est donc à but pédagogique.
Ce programmme permet de remplir diverses fonctions présentes dans le Cahier des Charges (CdC).
- Il permet entre autre d'enregistrer un flux vidéo durant une durée déterminée
- Visionner le flux qui sera enregistré
- Il possède un delai avant l'enregistrement
Le tout est une fonction qu'il vous faudra appeller. Pour des raison de simplicité, celle-ci est appellé à la fin du code (ligne 234)
*/
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <thread> // sleep_for, sleep_until
#include <QDate> // pour gérer ce qui est de la date
#include <QFile> // Vérifier les noms de fichier
#include <iostream>
#include <QDebug>
#include <opencv2/opencv.hpp>
using namespace std;
int TempsEnregistrement(int temps) // Permet d'attribuer automatiquement le nombre d'image lors de l'enregistrement d'image plutôt que de mettre un nombre fixe
{
int i;
i = temps * 60 *25; // calcul
return i;
}
void Enregistrement(string Nom, int Temps)
{
///======================================== OUVERTURE FLUX VIDEO ========================================///
//cgi-bin/faststream.jpg --> Common Gateway Interface (Interface de passerelle commune),
//stream=half&
//&rand=COUNTER -->obligatoire
std::this_thread::sleep_for(1s); // gérer le temps d'attente avant le lancement de la caméra
cv::VideoCapture cap("rtsp://172.17.50.235:8554/1.3gp",cv::CAP_FFMPEG); //caméra IP SNIR
if (!cap.isOpened()) // cap est un attribut protégé
{
qDebug("Camera non ouverte !"); //Impossibilité d'ouvrir la caméra
}
//==========================================================================================================//
cv::Mat Frame; // // Mat pour matrice --> Contient info (taille de la matrice / la méthode use pour le stockage, à quelle adresse est la matrice stockée)
// La taille de la matrice elle-même peut varier d’une image à l’autre.
// Def pointeur de données matricielles ? Ce sont les données uchar*, qui pointent vers les données de la matrice.
// Avantage de 2 parties? Nous pouvons faire une copie superficielle d’une matrice et utiliser un compteur de référence pour la gestion de la mémoire.
//Comptage de références --> technique consistant à stocker le nombre de références, de pointeur.
cv::Mat im;
///======================================== DÉFINITION TAILLE / FRAME IMAGE ========================================///
int frameWidth = cap.get(cv::CAP_PROP_FRAME_WIDTH); // Largeur
int frameHeigth = cap.get(cv::CAP_PROP_FRAME_HEIGHT); // Hauteur
//int frameRate= cap.get(cv::CAP_PROP_FPS); // nombre de FPS
//===================================================================================================================//
///======================================== GÉRER LE NOMBRE DE SESSION ========================================///
// four cc --> Concatène 4 caractères en un code fourcc --> identifier le format d'une vidéo
// la caméra étant en 3GP, il est mieux d'eregistrer en .avi et cela oblige d'utiliser le codec PIM1
//.mp4 --> fourcc('M','P','4','V')
//.avi --> fourcc('J','P','E','G')
//afin de savoir si un fichier existe
QString Nom1=QString::fromStdString(Nom); // QFile prends des QStrings donc on fait une conversion de string en QString
bool Vid1, Vid2;
Vid1 = QFile::exists(Nom1+"1.avi"); // fichier 1 existe ?
Vid2 = QFile::exists(Nom1+"2.avi"); // Fichier 2 existe ?
///======================================== Session 1 ========================================///
if((Vid1==false) && (Vid2==false))
{
qDebug("\nLe fichier n'existe pas --> creation d'un fichier d'enregistrement\n");
cv::VideoWriter output(Nom+"1.avi",cv::VideoWriter::fourcc('P','I','M','1'),25,cv::Size(frameWidth,frameHeigth),true); // 25 : nombre de FPS
if (!output.isOpened())
{
qDebug("Impossible d'ouvrir le flux video... (vérifiez l'adresse IP de la caméra)"); // Ouverture du flux vidéo impossible
}
//========== Boucle d'enregistrement ==========//
TempsEnregistrement(Temps);
int images = TempsEnregistrement(Temps); // Nombre d'image à enregistrer
while(images)
{
cap.read(Frame); //lecture des image
if (Frame.empty()) //Si plus aucune image -> break
{
qDebug("\nPlus aucune image recuperable\n");
break;
}
cv::imshow("Enregistrement Video (session 1)",Frame); //afficher l'image + le titre : enregistrement vidéo.
output.write(Frame); //écriture image par image
if (cv::waitKey(5)==27) //Presser esc pour fermer la fenêtre (ascii décimal).
{
qDebug("\n\nLa touche 'echap' a été appuyee. Arret de l'enregistrement en cours.");
break;
}
images--; //décrémentation du nombre d'image
}
qDebug("\nFin de recuperation des images \n");
//=============== Libération image / sorties ===============//
cap.release(); // "libération" des images
output.release(); // libérer les sorties
qDebug("Programme termine, fermeture de toutes les fenetres");
cv::destroyAllWindows(); //fermer toutes les fenêtres
}
///======================================== Session 2 ========================================///
if((Vid1==true) && (Vid2==false))
{
qDebug("\nLe fichier existait déjà --> creation d'un second fichier d'enregistrement\n");
cv::VideoWriter output(Nom+"2.avi",cv::VideoWriter::fourcc('P','I','M','1'),25,cv::Size(frameWidth,frameHeigth),true); // 25 : nombre de FPS
if(!output.isOpened())
{
qDebug("Impossible d'ouvrir le flux video... (vérifiez l'adresse IP de la caméra)"); // Message erreur si ouverture du flux vidéo impossible
}
//========== Boucle d'enregistrement ==========//
int images = TempsEnregistrement(1); // Nombre d'image à enregistrer --> cf fonction TempsEnregistrement
while(images)
{
cap.read(Frame); //lecture des image
if (Frame.empty()) //Si plus aucune image -> break
{
qDebug("\nPlus aucune image recuperable\n");
break;
}
cv::imshow("Enregistrement Video (Session 2)",Frame); //afficher l'image + le titre : enregistrement vidéo.
output.write(Frame); //écriture image par image
if (cv::waitKey(5)==27) //Presser esc pour fermer la fenêtre (ascii décimal).
{
qDebug("\nLa touche \"echap\" a été appuyee. Arret de l'enregistrement en cours.");
break;
}
images--; //décrémentation du nombre d'image
}
qDebug("\nFin de recuperation des images \n");
//=============== Libération image / sorties ===============//
cap.release(); // "libération" des images
output.release(); // libérer les sorties
qDebug("Programme termine, fermeture de toutes les fenetres");
cv::destroyAllWindows(); //fermer toutes les fenêtres
}
///======================================== Session 3 ========================================///
if((Vid1==true) && (Vid2==true))
{
qDebug("\n2 fichiers existent déjà --> écrasement du premier fichier d'enregsitrement\n");
cv::VideoWriter output(Nom+"1.avi",cv::VideoWriter::fourcc('P','I','M','1'),25,cv::Size(frameWidth,frameHeigth),true); // 25 : nombre de FPS
if(!output.isOpened())
{
qDebug("Impossible d'ouvrir le flux video... (vérifiez l'adresse IP de la caméra)"); // Message erreur si ouverture du flux vidéo impossible
}
//========== Boucle d'enregistrement ==========//
int images = TempsEnregistrement(1); // Nombre d'image à enregistrer
while(images)
{
cap.read(Frame); //lecture des image
if (Frame.empty()) //Si plus aucune image -> break
{
qDebug("\nPlus aucune image recuperable\n");
break;
}
cv::imshow("Enregistrement Video (Session 3)",Frame); //afficher l'image + le titre : enregistrement vidéo.
output.write(Frame); //écriture image par image
if (cv::waitKey(5)==27) //Presser esc pour fermer la fenêtre (ascii décimal).
{
qDebug("\nLa touche \"echap\" a été appuyee. Arret de l'enregistrement en cours.");
break;
}
images--; //décrémentation du nombre d'image
}
qDebug("\nFin de recuperation des images \n");
//=============== Libération image / sorties ===============//
cap.release(); // "libération" des images
output.release(); // libérer les sorties
qDebug("Programme termine, fermeture de toutes les fenetres");
cv::destroyAllWindows(); //fermer toutes les fenêtres
}
};
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), ui(new Ui::MainWindow)
{
Enregistrement("THEROND", 1);
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}