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é.

OriginalL'auteur mpenkov | 2010-12-04