OpenCV n'a pas de rapport précis fréquence d'image/comte
J'ai un 33 deuxième vidéo que je suis en train d'essayer de traiter avec OpenCV. Mon objectif est de déterminer quelle instance dans le temps (par rapport au début de la vidéo) chaque image correspond à. Je fais cela dans le but de être capable de comparer des images à partir de vidéos de la même scène qui ont été enregistrées à des cadences différentes.
Ce travail:
- Le FPS est correctement signalé comme 59.75. Ceci est cohérent avec ce que
ffprobe
rapports, donc je suis heureux de croire que c'est exact.
Les problèmes que je rencontre sont:
CAP_PROP_POS_MSEC
renvoie des valeurs incorrectes. D'ici à la fin de la vidéo, c'est à 557924ms (plus de 9 min). Pour un 33s vidéo, cela peut ne pas être juste.CAP_PROP_FRAME_COUNT
est également incorrect. Il est rapporté que 33371, qui à 59.75 fps donnerait plus de 9 minutes de métrage. Compatible avec l'erreur ci-dessus, mais encore incorrecte.CAP_PROP_POS_FRAME
est de la même manière incorrecte.
La vidéo peut être trouvé ici (approx. 10 MO).
Toutes les idées sur ce qui pourrait être mauvais?
ffprobe
de sortie:
FFprobe version SVN-r20090707, Copyright (c) 2007-2009 Stefano Sabatini
libavutil 49.15. 0 / 49.15. 0
libavcodec 52.20. 0 / 52.20. 1
libavformat 52.31. 0 / 52.31. 0
built on Jan 20 2010 00:13:01, gcc: 4.4.3 20100116 (prerelease)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/misha/Dropbox/Public/sequence.mp4':
Duration: 00:00:33.37, start: 0.000000, bitrate: 2760 kb/s
Stream #0.0(und): Video: h264, yuv420p, 1920x1080, 59.75 tbr, 1k tbn, 2k tbc
Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16
Code complet:
#include <iostream>
#include <assert.h>
#include <cv.h>
#include <highgui.h>
#include <cmath>
#include <iostream>
#include <string.h>
#include <stdio.h>
extern "C"
{
#include "options.h"
}
using namespace std;
#define DEBUG 0
static void
print_usage(char *argv0)
{
cerr << "usage: " << argv0 << " video.avi [options]" << endl;
}
int main(int argc, char** argv)
{
if (argc < 2)
{
print_usage(argv[0]);
return -1;
}
int step = 30;
struct Option options[] =
{
{ "step", 1, &step },
{ NULL, 0, NULL }
};
int ret = parse_options(2, argc, argv, options);
if (ret == 0)
{
print_usage(argv[0]);
return -1;
}
CvCapture *capture = cvCaptureFromFile(argv[1]);
int counter = 0;
while (cvGrabFrame(capture))
{
++counter;
IplImage *frame = cvRetrieveFrame(capture);
double millis = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_MSEC);
double current = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES);
double total = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
printf("%d %d/%d %f\n", counter, (int)current, (int)total, millis);
int min = (int)(millis/1000/60);
millis -= min*60000;
int sec = (int)(millis/1000);
millis -= sec*1000;
printf("%d %02d:%02d:%f\n", counter, min, sec, millis);
}
cvReleaseCapture(&capture);
return 0;
}
Qui êtes-vous à l'aide de: Windows/Linux/Mac ?
Linux (Ubuntu 10.04 LTS)
Qui explique beaucoup de choses. OpenCV est encore à travailler sur l'amélioration du soutien de vidéo de jeux sous Linux, désolé.
Linux (Ubuntu 10.04 LTS)
Qui explique beaucoup de choses. OpenCV est encore à travailler sur l'amélioration du soutien de vidéo de jeux sous Linux, désolé.
OriginalL'auteur mpenkov | 2010-12-04
Vous devez vous connecter pour publier un commentaire.
Toujours informer la version du logiciel que vous utilisez: qui OpenCV version utilisez-vous pour cela? La vôtre peut-être une ancienne version, afin de mettre à jour la plus récente si possible.
Si votre fichier vidéo fait partie d'une autre vidéo plus grande, cette information peut être correct, car:
OpenCV peut-être tout simplement la lecture de tous ces trucs dans le fichier d'en-tête, ce qui est évidemment faux. Ce qui pourrait arriver si quelqu'un a utilisé une hache (ou d'autres médiévale outil) de bande de ce morceau de la vidéo d'origine.
Vous devriez essayer avec des vidéos que vous avez fait et vous savez qu'ils n'ont pas été altérées.
Pire des cas, vous aurez à mettre en œuvre ces fonctionnalités vous-même. Pas trop grave.
EDIT:
@misha je n'avais pas remarqué au premier abord que vous utilisez:
De le remplacer pour cvCaptureFromAVI() si vous le pouvez, et TOUJOURS vérifier la valeur de retour de OpenCV appels:
Il y A quelques jours, j'ai partagé un code qui utilise OpenCV pour lire un fichier vidéo, puis enregistrer les images comme JPG images sur le disque. Il indique également les FPS actuelle à l'aide de la traditionnelle
cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
de sorte qu'il pourrait être intéressant pour vous de prendre un coup d'oeil à ça. Aller vérifier.EDIT:
Vous devriez également vérifier ce fil sur le nombre d'images à l'aide d'OpenCV;
En passant, je viens de mettre à jour certaines bibliothèques sur mon système Ubuntu et recompilé OpenCV-2.1.0.le goudron.bz2 (à l'aide de cmake). J'ai changé mon code source (qui utilise cvCaptureFromAVI()) pour imprimer des choses en utilisant votre méthode de débogage sur chaque image. Il semble que cela fonctionne:
cout << "OpenCV version: " << CV_VERSION << endl;
donneOpenCV version: 2.0.0
Je suis à l'aide d'OpenCV 2.1 (ce qui n'est pas la plus récente) et qui fonctionne très bien. Mise à jour OpenCV sur votre ordinateur et essayez à nouveau.
J'ai installé 2.1. Le résultat est toujours le même 🙁 je n'ai pas l'esprit de la ré-écriture de cette fonctionnalité pour contourner le problème, comme vous l'avez dit, c'est pas trop grave. Mes questions sont: comment puis-je sais que je peux faire confiance à la valeur de fps dans l'en-tête? Qu'en est variable fps vidéos?
Mise à jour de réponse.
Merci pour la mise à jour. J'ai essayé
cvCaptureFromAVI
-- le résultat est le même qu'avant. Étrangement, cette fonction n'est pas dans ma 2.1.0 doc API, mais il semble que pour compiler et lier de l'amende. Il ne semble pas être beaucoup de documentation à ce sujet (au moins sur le opencv page, Google crache un couple de liens, si). Est-il une sorte d'Oeuf de pâques fonction ou quelque chose? Je vais jouer avec le codage de ma propre approche pour le sujet du problème dans les prochains jours, et après revenir ici lorsque j'ai quelque chose à montrer (ou plusieurs questions à poser :)). En attendant, merci pour votre aide, +1 pour l'effort.OriginalL'auteur