zoukankan      html  css  js  c++  java
  • 使用OPENCV播放AVI视频

    本次讲解如何使用OPENCV播放AVI视频,不过在写程序之前得告诉大家一声,OPENCV只支持AVI格式的视频播放。

    首先,源代码基本格式:

    #include<highgui.h>
    int main(int argc,char** argv)
    {
     cvNamedWindow("Michael",CV_WINDOW_AUTOSIZE);
     CvCapture* capture=cvCreateFileCapture(argv[1]);
     IplImage* frame;
     while(1)
     {
      frame=cvQueryFrame(capture);
      if(!frame) break;
      cvShowImage("Example2",frame);
      char c=cvWaitKey(30);
      if(c==27) break;
     }
     cvReleaseCapture(&capture);
     cvDestroyWindow("Example2");
    }

    下面在一一解释代码意思:

    本次代码中有些函数与上篇中的一样(意思与功能),所以不再废话。

    CvCapture* capture=cvCreateFileCapture(argv[1]);

    函数cvCreateFileCapture()通过参数设置确定要读入的AVI文件,返回一个指向CvCapture结构的指针,这个结构包含要读入的AVI文件的所有信息,其中包含状态信息。

      frame=cvQueryFrame(capture);

    一旦进入while(1)循环,我们便开始读入AVI文件, cvQueryFrame()的参数为Capture结构的指针,用来将下一帧视频文件载入内存。返回一个对应当前帧的指针,与cvLoadImage不同的是cvLoadImage为图像分配内存空间,而cvQueryFrame()使用已经在cvCapture结构中分配好的内存,所以,当结构CvCapture被释放后,每一帧图像所对应的内存空间即会被释放。

     char c=cvWaitKey(30);
      if(c==27) break;

    当前帧被显示后,我们会等待33毫秒,接着播放下一帧。如果其间用户触发了一个按键,c就会被相应置成这个按键的ASCII码,ESC的ASCII码为27,所以ESC即表示退出当前视频播放。

    cvReleaseCapture(&capture);
    cvDestroyWindow("Example2");

    退出视频播放,释放相应的指针和窗口。

    小试牛刀:

    #include<highgui.h>
    int main(int argc,char** argv)
    {
     cvNamedWindow("Michael");
     CvCapture* capture=cvCreateFileCapture("F:\sample.avi");
     IplImage* frame;
     while(1)
     {
      frame=cvQueryFrame(capture);
      if(!frame) break;
      cvShowImage("Michael",frame);
      char c=cvWaitKey(30);
      if(c==27) break;
     }
     cvReleaseCapture(&capture);
     cvDestroyWindow("Michael");
    }

    此次,我播放的是我收集的一部电影《了不起的盖茨比》的部分剪辑,就是电影的那段放歌曲《young and beautiful》的片段。

    程序写完后,可能必不能立即播放视频,首先要检查程序是否出错,一般只要出现视频一闪的情况程序可能就没问题,那么该如何才能正常播放视频了,我的只出现程序正确但老是一闪的情况,对于这种情况,网上有一些解法,我在这里推荐一种方法:

    http://blog.csdn.net/makenothing/article/details/8128455,这是我在Google上搜到的,可以参考一下。

  • 相关阅读:
    【LeetCode】119. Pascal's Triangle II
    随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比[转]
    linux下一些可用库
    malloc分配的内存空间是连续的吗
    语言模型训练网站
    relocation 错误
    undefined reference to `dlopen'
    静态库之间有依赖关系顺序很重要
    C++引用详解
    malloc原理和内存碎片[转]
  • 原文地址:https://www.cnblogs.com/MichaelLi1994/p/3521439.html
Copyright © 2011-2022 走看看