• OpenCV学习 2:播放AVI视频


    原创文章,欢迎转载,转载请注明出处

    第二个程序,播放视频。用opencv做起来是如此的简单。。哈哈。
               学Opencv,只是为了在它的基础上实现工程应用,而它里面高深的理论我等屌丝只能感叹了,希望学习的效果是能清楚 了解视觉方面所需要用到的工具和对他们有一定的了解,后续通过对这些理论和工具的了解实现相应的视觉功能,现在还不够熟悉,就照着教材和API学习下。
              视频,就是一张一张的画面,正常大于24帧人眼就看不到闪烁了。程序的大概思路就是通过opencv给的函数接口,一帧一帧的读取AVI视频的信息,然后刷新显示就OK了。
              各种函数可以通过http://wiki.opencv.org.cn/index.php/Template:Doc,查找参考手册的到函数的原型。
               首先需要创建一个窗口,查wiki可以查到函数原型如下:

    1 cvNamedWindow
    2 创建窗口
    3 int cvNamedWindow( const char* name, int flags=CV_WINDOW_AUTOSIZE );
    4 name 
    5 窗口的名字,它被用来区分不同的窗口,并被显示为窗口标题。
    6 flags 
    7 窗口属性标志,为1时表示会根据图像自动调整窗口大小。目前唯一支持的标志是CV_WINDOW_AUTOSIZE。当这个标志被设置后,用户不能手动改变窗口大小,窗口大小会自动调整以适合被显示图像(参考cvShowImage)。
    8 函数cvNamedWindow创建一个可以放置图像和trackbar的窗口。被创建的窗口可以通过它们的名字被引用。
    9 如果已经存在这个名字的窗口,这个函数将不做任何事情。

        然后通过cvCreateFileCapture函数初始化获取视频,函数原型如下:

    1 cvCreateFileCapture
    2 初始化从文件中获取视频
    3 CvCapture* cvCreateFileCapture( const char* filename );
    4 filename 
    5 视频文件名。
    6 函数cvCreateFileCapture给指定文件中的视频流分配和初始化CvCapture结构。
    7 当分配的结构不再使用的时候,它应该使用cvReleaseCapture函数释放掉。

       视频已经获取了,然后就是一帧一帧显示咯。。哈 


    源代码如下:

     1 #include <highgui.h>
     2 void main()
     3 {
     4     cvNamedWindow("2.2", CV_WINDOW_AUTOSIZE );    //创建窗口
     5     CvCapture* capture = cvCreateFileCapture("takeoff.avi");
     6     IplImage* frame;
     7     while (1)
     8     {
     9         frame = cvQueryFrame( capture );    //获取一帧视频
    10         if (NULL == frame)
    11         {
    12             break;
    13         }
    14         cvShowImage("2.2", frame);
    15         char c = cvWaitKey(33);                //延时等待按键
    16         if (27 == c)                        //esc的按键码
    17         {
    18             break;
    19         }
    20     }
    21     cvReleaseCapture(&capture);
    22     cvDestroyWindow("2.2");
    23 }
    视频是用的之前做四轴拍摄的

      再次看看四轴第一次离地的截图。。

    加个进度条  主要就一个函数 cvCreateTrackbar,创建一个滚动条,然后可以设置一个回调函数,当滚动条被我们触发的时候,库会自动调用回调函数,回调函数是“不需要你问我在干什么,我会告诉你我在干什么”,UCGUI里面大概对回调函数有这样一句解释。。哈。。出发后,通过cvSetCaptureProperty函数设置当前帧的为止,就可以实现鼠标拖动滚动条控制视频的播放了,真是简单暴力。
    为了让滚动条可以和视频联动,还需要两个函数,一个是获取视频当前的帧cvGetCaptureProperty和设置滚动条位置的函数cvSetTrackbarPos,有了这个就可以联动了。。函数原型就不写了,wiki上全有。。

    1 frames = (int)cvGetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES);      //获取当前帧数
    2 cvSetTrackbarPos("Position", "2.2", frames);

    不过里面有个问题,在循环里面加了  这两行代码更新滚动条,不知道为什么,会导致视频的帧率越来越低。。。。。不用的时候,CPU只有1%使用,用了后六核都要60%多用到,不知道问题在哪。。。。囧。。。以后再看看。哈。。

  • 相关阅读:
    linux基础知识-12
    linux基础知识-11
    linux基础知识-10
    安装与迁移Solo博客系统
    linux基础知识-9
    linux基础知识-8
    linux基础知识-7
    linux基础知识-6
    linux基础知识-5
    通俗解释下分布式、高并发、多线程
  • 原文地址:https://www.cnblogs.com/adfjhg/p/4188196.html
Copyright © 2020-2023  润新知