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

wafafolla Messages postés 10 Date d'inscription mercredi 14 juillet 2010 Statut Membre Dernière intervention 21 mai 2012 - 21 mai 2012 à 15:35
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 - 22 mai 2012 à 01:53
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

katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
22 mai 2012 à 01:53
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).
0
Rejoignez-nous