Problème d'enregistrement de vidéo avec opencv

Signaler
Messages postés
10
Date d'inscription
mercredi 14 juillet 2010
Statut
Membre
Dernière intervention
21 mai 2012
-
katsankat
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
-
salut ,
je veux enregistrer une séquence vidéo à partir d'une caméra ip. pour ce fait, j'ai utilisé opencv, le problème c'est que je n'arrive pas à stopper l'enregistrement dans une durée bien déterminée. (par exemple je veux enregistrer une séquence de 1 mn pas plus).
j'ai essayé d'utiliser un timer mais l'enregistrement ne s’arrête pas
avez vous une idée concernant ce sujet ??
voici le code: une methode enregistrer() et une methode timer() qui décrémente un entier m=60 chaque seconde.
Enregistrement::Enregistrement(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Enregistrement)
{
    ui->setupUi(this);

    m = 60;
    timer = new QTimer();
    connect(timer,SIGNAL(timeout()), this,SLOT(timer()));

}
void Enregistrement::opencvEnregistrer()
{
        CvCapture *capt;
        CvVideoWriter *videoWriter;
        IplImage* image;
timer->start(1000);
        capt = cvCaptureFromFile("http://192.168.1.71/axis-cgi/mjpg/video.cgi?.mjpg");

        cvGrabFrame(capt);
        image = cvRetrieveFrame(capt);
videoWriter=cvCreateVideoWriter("enregist.avi",CV_FOURCC('D','I','V','X'),20,cvSize(image->width,image->height),1);
exit_key_press=0;
while(exit_key_press!='q')
            {
            cvGrabFrame(capt);
            image = cvRetrieveFrame(capt);
            if (image)
            cvWriteFrame(videoWriter,image);
            //exit_key_press = cvWaitKey(1);
            }
            cvReleaseCapture(&capt);
            cvReleaseVideoWriter(&videoWriter);
}
void Enregistrement:: timer()
{

    m = m-1;
    if(m==0) // apres une minute l'entier m=0 alors exit_key_press ='q' pour que l'enregistrement s'arrête 
        exit_key_press='q';
}

bon moi je travail avec Qt mais quelque soit l'idée (en c ou c++), peut m'aider.
merci d'avance

1 réponse

Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
Salut,
Au moment de créer le CvVideoWriter, regarder le timestamp du système (c'est le nombre de secondes écoulées depuis le 1er janvier 1970). De là tu sais que la vidéo devra stopper si (timestamp actuel > timestamp de départ + 60s).
Le code est différent selon la plateforme.
Sous windows GetLocalTime() fonctionne, je m'en sers pour capturer une image par minute pour faire une vidéo accélérée: GetLocalTime() te permet de calculer la date de fin de capture à la seconde près avec st.wMinute + 1.
 #ifdef WIN32
  static const char *jour[7] ={"Dim","Lun","Mar","Mer","Jeu","Ven","Sam"};
  SYSTEMTIME st;
  GetLocalTime(&st);
  sprintf(heure,"%s %02d/%02d/%04d %02d:%02d:%02d", jour[st.wDayOfWeek],
                st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond);
 #else


Autre solution mais je sais pas si ça marche sous Qt: dans la boucle ajouter cvWaitKey(1000), ce qui fera que la boucle tourne à 1Hz. Un simple
if (c++ > 60) break; suffirait alors pour stopper la capture. Avec cvWaitKey(10).