की रिपोर्ट नहीं करता है मेरे पास 33 सेकंड वीडियो है जिसे मैं ओपनसीवी के साथ संसाधित करने की कोशिश कर रहा हूं। मेरा लक्ष्य यह निर्धारित करना है कि समय में कौन सा उदाहरण (वीडियो की शुरुआत के सापेक्ष) प्रत्येक फ्रेम के अनुरूप है। मैं यह वही दृश्य के वीडियो से फ्रेम की तुलना करने में सक्षम होने के लिए कर रहा हूं जो अलग-अलग फ्रेम दरों पर दर्ज किया गया है।ओपनसीवी सटीक फ्रेम दर/गिनती
क्या काम कर रहा है:
- एफपीएस सही ढंग से 59.75 के रूप में रिपोर्ट किया गया है। यह
ffprobe
रिपोर्ट के साथ संगत है, इसलिए मुझे विश्वास है कि यह सही है।
समस्याओं मैं आ रही हैं:
CAP_PROP_POS_MSEC
रिटर्न गलत मान। वीडियो के अंत तक, यह 557924ms (9 मिनट से अधिक) तक है। 33 के वीडियो के लिए, यह सही नहीं हो सकता है।CAP_PROP_FRAME_COUNT
भी गलत है। यह 33371 के रूप में रिपोर्ट किया गया है, जो 59.75 एफपीएस पर 9 मिनट से अधिक फुटेज प्रदान करेगा। उपरोक्त त्रुटि के अनुरूप, लेकिन अभी भी गलत है।CAP_PROP_POS_FRAME
इसी तरह गलत है।
वीडियो here (लगभग 10 एमबी) पाया जा सकता है।
क्या गलत हो सकता है पर कोई विचार?
ffprobe
उत्पादन:
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
पूर्ण कोड:
#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;
}
आप किस का उपयोग कर रहे हैं: विंडोज/लिनक्स/मैक? – karlphillip
लिनक्स (उबंटू 10.04 एलटीएस) – misha
जो बहुत कुछ बताता है। ओपनसीवी अभी भी लिनक्स के तहत वीडियो फ्लस के समर्थन में सुधार करने के लिए काम कर रहा है, क्षमा करें। – karlphillip