从 AVI 捕获 OpenCV 帧

Posted

技术标签:

【中文标题】从 AVI 捕获 OpenCV 帧【英文标题】:OpenCV frame capture from AVI 【发布时间】:2012-05-21 02:55:09 【问题描述】:

我正在使用 openCV 2.2 开发一个项目。我需要对 AVI 文件的每一帧进行处理,但是当我运行我的代码时,它只抓取文件的第一帧。 CV_CAP_PROP_POS_FRAMES 似乎没有工作。有什么想法为什么不呢?

    CvCapture* capture = cvCaptureFromAVI("test1.avi");

    IplImage *img = 0;

    if (!cvGrabFrame(capture)) 
            printf("Error: Couldn't open the image file.\n");
            return 1;
    

    int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
    int posFrame = 1;
    for(int i =0; i <= numFrames; i++)
        cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, i);
              posFrame = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES);

              img = cvGrabFrame(capture);
              cvNamedWindow("Image:", CV_WINDOW_AUTOSIZE);
              cvShowImage("Image:", img);
              printf("%i\n",posFrame);

              cvWaitKey(0);

              cvDestroyWindow("Image:");
    

【问题讨论】:

你为什么不用 2.3.1 或 2.4? 我用 opencv 2.3.1 测试过,问题仍然存在。 【参考方案1】:

您为什么不使用 OpenCV 2.3 尝试这种方式?我认为它更直接,更有效,更清晰:

VideoCapture _videoSource;

if(!_videoSource.open("test1.avi")) 

   exit(1);         // Exit if fail

_videoSource.set(CV_CAP_PROP_CONVERT_RGB, 1);

Mat frame;
namedWindow("Image");
int posFrame;

while(1) 

  _videoSource >> frame;
  posFrame=_videoSource.get(CV_CAP_PROP_POS_FRAMES);
  imshow("output", frame);
  return 0;

这样的事情应该可以工作。

【讨论】:

以上是关于从 AVI 捕获 OpenCV 帧的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 从 .avi 视频中获取帧

OpenCV将帧附加到现有视频(.avi)文件?

opencv 提取avi视频中的帧,逐帧播放

OpenCV,捕获的视频比原始相机视频运行得更快!

OpenCv - 从网络摄像头捕获帧时发生内存泄漏

MacOS 上的视频捕获