Problème de capture vidéo et fps OpenCV

Je capture des vidéos de ma webcam en utilisant OpenCV sur MacOSX. Cela fonctionne bien, mais lorsque j’essaie de lire QuickTime, la vidéo capturée est lue trop rapidement. c’est-à-dire que je capture depuis la caméra pendant 10 secondes, mais lorsque je joue sur QuickTime, la vidéo dure 2 secondes.

J’ai essayé de changer le nombre de fps de 25 à 10 et cela fonctionne assez bien, mais je suis sûr que ce n’est pas la bonne procédure:

CvVideoWriter *writer = 0; int isColor = 1; int fps = 25; int frameW = 640; // 744 for firewire cameras int frameH = 480; // 480 for firewire cameras 

Le problème est que, pour le moment, je dois capturer avec WebCam mais le véritable objective du programme est de capturer une image à partir de n’importe quelle source externe connectée à mon Mac.

J’utilise ce code pour capturer:

 for (;;) { cvGrabFrame(capture) image = cvResortingeveFrame(capture); cvWriteFrame( writer, image ); } 

Un indice? Je montre également la sortie webcam sur cvNamedWindow, comment puis-je améliorer la qualité de cette fenêtre?

merci beaucoup à tous!

Andrea!

Peut-être que la compression de la vidéo capturée et son enregistrement dans un fichier nécessitent trop de temps CPU. Si c’est le cas, vous ne voyez réellement que 10 images par seconde dans la fenêtre cvNamedWindow, et seulement 10 images par seconde sont écrites dans le fichier. Spécifier 25 FPS dans le fichier accélérera naturellement la lecture.

Pour voir si c’est vraiment votre problème, vous pouvez essayer de sauvegarder les données d’image uniquement en mémoire. Je ne l’ai pas essayé, mais je pense que vous le feriez avec cvCloneImage ().

Vous pouvez également essayer un autre format avec une surcharge de temps CPU réduit pour enregistrer votre vidéo:

 CV_FOURCC('P','I','M','1') = MPEG-1 codec CV_FOURCC('M','J','P','G') = motion-jpeg codec (does not work well) CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec CV_FOURCC('U', '2', '6', '3') = H263 codec CV_FOURCC('I', '2', '6', '3') = H263I codec CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec 

Utilisez cvCreateVideoWriter(filename, fourcc, fps, frame size, is color) avec fps = 10 , fps = 20 et des valeurs différentes. Si vous connaissez déjà la valeur en fps des images provenant de la caméra, utilisez-la.

Le problème est que vous obtenez moins d’images par seconde de la caméra et que vous écrivez plus d’images dans un fichier vidéo

Cordialement, Saleh.

J’avais des performances similaires à celles que vous avez mentionnées (environ 10 images par seconde) et j’ai constaté que les appels successifs de resortingeveFrame() prenaient une éternité. J’ai constaté que getCaptureProperty(CV_CAP_PROP_FPS) était à une valeur par défaut de 0. J’ai changé cette valeur en 25 à l’aide de setCaptureProperty(CV_CAP_PROP_FPS,25.0) et setCaptureProperty(CV_CAP_PROP_FPS,25.0) pu capturer beaucoup plus rapidement.

Je confirme que 10 ips est la norme, bien que je pense que cela pourrait être dû au fait que vous n’avez pas d’appareil photo qui capture à plus de 10 ips (ce qui est probablement le problème).

Cela rest étrange car j’utilise waitkey(30) , ce qui devrait être 33fps , mais c’est précisément 10.