2011-02-17 6 views
0

J'essaie d'écrire un logiciel d'enregistrement qui écrirait un flux vidéo entrant dans l'ordinateur vers un fichier avi. J'utilise OpenCV et videoInput.h pour gérer le code DirectShow. Juste au cas où cela est important j'utilise Visual Studio 2010 en tant que compilateur.OpenCV videoInput.h Vitesse de capture différente de la vitesse d'écriture

Le problème que je rencontre est que le fichier enregistré est lu plus rapidement que le fichier prévisualisé. Pas trop, mais juste assez pour être perceptible. EXEMPLE: L'aperçu de 10 secondes est un fichier d'environ 7 secondes, donc tout le monde bouge juste un peu trop vite.

if(bWriteVideo) 
{ 
    writer=cvCreateVideoWriter(szFileName,CV_FOURCC('D','I','V','X'), 
           fps,cvSize(width, height),isColor); 
    if(!writer) return 1; 
} 

if(bDisplayVideo) 
    cvNamedWindow("video", 0); 

while(key != 'q') 
{ 
    if(VI.isFrameNew(nSource)) 
    { 
     VI.getPixels(nSource, yourBuffer1, false, true); 

     frame = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3); 
     frame->imageData = (char*)yourBuffer1; 
     frame->imageDataOrigin = frame->imageData; 

     if(!frame) break; 

     // Display Image to Screen 
     if(bDisplayVideo) 
      cvShowImage("video" , frame); 

     if(bWriteVideo) 
      cvWriteFrame(writer, frame);  
    } 
     key = cvWaitKey (1000/fps);  
} 

Répondre

1

Supposons que les trames arrivent avec 30 FPS. Votre code fait ce qui suit:

  • si une nouvelle trame est arrivée, alors enregistrez-la, puis attendez 1000/fps ms (c'est ~ 33,3 ms).
  • sinon ... alors attendez.

Supposons que l'enregistrement d'une trame prend 10ms. Donc, une boucle-exécution prend soit 33,3 ms (aucune trame entrante) ou 44,3 ms (si nous devions en enregistrer une). Nous n'allons donc pas tous les sauvegarder (parfois nous aurons deux trames entrantes dans une période de 44,3 ms, mais nous n'en sauvegardons qu'une). Ainsi, la vidéo de sortie aura moins de 30 images par seconde réelle. Si on joue avec 30 FPS ... c'est plus rapide que la réalité! Donc, essayez d'éviter d'attendre beaucoup à la fin de la boucle. Par exemple, en réduisant la durée d'appel des appels cvWaitKey. (Par exemple, en remplaçant 1000 par 100.) La boucle s'exécute plusieurs fois pour chaque image, en attendant 3,3 millisecondes à la fois, puis en cherchant une nouvelle image (et s'il y en a une, enregistrez-la). C'est 10 (sauvegarde) + 3.3 (attente) ms dans le pire des cas, donc nous ne manquerons aucune nouvelle image pendant ce temps.

+0

Merci qui a aidé! J'ai fini par enlever complètement le "cvWatiKey" car il ne peut être utilisé que si la fenêtre OpenCV est générée et finalement c'est une application console, mais c'est l'attente qui l'a ralentie. – Kerigan