播放一个视频并用滚动条控制进度-OpenCV应用学习笔记二

今天我们来做个有趣的程序实现:利用OpenCV读取本地文件夹的视频文件,并且在窗口中创建拖动控制条来显示并且控制视频文件的读取进度。

此程序调试花费了笔者近一天时间,其实大体程序都已经很快写出,结果执行时却出现拖动条不能控制视频读取进度现象,结果发现是”一个大小写字母引发的血案“——在创建拖动条时命名为:Position,但是在设置拖动条的视频位置时却疏忽写为:position。为此笔者反复了N遍,由此可见程序的严格性,以及“搬砖码垛”时专注的重要性。

同样在附上程序之前我们有必要对程序中出现的关键函数给出深度解析,这个也会成为笔者对于学习笔记的博客书写风格:开篇小叙——程序实现功能——关键函数精析——附上完整测试程序;如果有更好的书写方案希望与大家不吝赐教,唯一的目的就是为了让技术道路上的我们能更快的从彼此哪里获取实用信息,这个也是衡量一个大牛是否技术精通的重要指标:所谓的助攻能力!!!共勉之

实现功能:

输入avi2.exe play2.avi命令符后,执行:Example2窗口播放play2.avi视频文件,并且在Position拖动条上显示进度,手动拖动能调节对应视频播放进度。

函数精析:

  • cvCreateFileCapture(const char* filename)/cvCaptureFromAVI(const char* filename)

  • 从指定文件filename中获取视频流,分配和初始化CvCaputure*结构指针
  • 两个函数等价,实现从文件夹中读取视频流;同时支持多种视频格式AVI、MP4、wmv等
  • cvCaptureFromCAM(int index)

  • 从摄像头中获取视频,多个摄像头的编号index;本地index=0;外部index=1
  • cvSetCaptureProperty(CvCapture* capture, int propId, double value)

  • 设置视频的属性 (视频对象,属性标识符,属性)
  • CV_CAP_PROP_POS_MSEC:视频当前位置,毫秒或者视频获取时间戳
  • CV_CAP_PROP_POS_MSEC:将被下一步解压获取的帧索引,以0为起点
  • CV_CAP_PROP_POS_AVI_RATIO:视频文件相对位置(0开头1结尾)
  • propId可取值如下:

  • cvGetCaptureProperty(CvCapture* capture, int propId)

  • 获取视频属性;propId同样适用上图
  • cvCreateTrackbar(barName, win1, int* value, int count, CvTrackbarCallback onChange)

  • 创建拖动条(拖动条标识符,窗口标识符,拖动条位置数字指针,最大位置,调用函数更新拖动后的位置)
  • 在win1窗口创建拖动条barName,count为其最大值,value为其当前值,onChange跟新拖动后的位置
  • cvSetTrackbarPos(barName,win1, int pos)

  • 设置win1窗口下barName拖动条的最新位置pos
  • cvQueryFrame(g_capture)

  • 从读取的视频流g_capture中读取一帧,并且解压返回这一帧,返回的图像可以被释放和修改
  • cvRetrieveFrame(g_capture)

  • 返回抓取图像的指针,但是返回的图像不能被释放和修改
  • 利用cvCloneImage()后可以对抓取的图像进行任何操作
  • cvGrabFrame(g_capture)

  • 捕捉视频或者相机的下一帧图像,尤其是应用在多相机的情况下
  • 附源代码:

#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
#include <iostream>
using namespace std;

 /*            声明三个全局变量并初始化             */
int g_slider_position                        //定义拖动条当前位置变量
int frame_count =0;                          //定义一个全局变量,控制滚动条的位置
CvCapture *g_capture = NULL;

/*    定义拖动条函数:设置视频获取信息(对指定视频g_capture
       设置属性标识符CV_CAP_PROP_POS_FRAMES的值pos)       */

void onTrackbarSlide(int pos)
{
    cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);
    frame_count = pos;                     //将设置的视频信息中的属性值保存到frame_count中
    return;
}

int  main(int argc,char** argv)
{
    if(argc == 2)
    {

        cvNamedWindow("Example2",0);
        g_capture = cvCaptureFromAVI(argv[1]);
                                       // cvCreateFileCapture(argv[1]); 读入AVI文件等价
        int frames = (int) cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);
                                       //获取视频文件属性的总帧数
        if(frames != 0)
        {
            /*   "position"表示滚动条的名词,"Example3"表示滚动条所属窗口,
                  g_slider_position表示滚动条当前位置。 frames表示滚动条的最大值,
                     onTrackbarSlide表示滚动条的回调函数(被拖动时调用)            */

            cvCreateTrackbar("Position","Example2",&g_slider_position,frames,onTrackbarSlide);
        }    

        IplImage* frame = NULL ;
        while(1)                            //实时捕捉视频帧显示,并且更新进度条
        {
              frame = cvQueryFrame(g_capture);//获得一帧图像
             if(!frame)  break;
               cvShowImage("Example2",frame);

            cvSetTrackbarPos( "Position", "Example2",  frame_count++  );
             /*    进度条根据视频进度跟新位置
                    拖动条设置的时候跟之前的创建名称不同导致拖动条不能根据
                    视频进度更新调试了一天终于发现这里“position”应该为“Position”
                    cout << g_slider_position << endl ;//可以看到为止更新数据     */

             char c = cvWaitKey(33);          //按下esc后退出
             if( c == 27)break;

        }
    }
    cvReleaseCapture(&g_capture);
    cvDestroyWindow("Example2");
    return 0;
}
时间: 2024-10-14 00:49:13

播放一个视频并用滚动条控制进度-OpenCV应用学习笔记二的相关文章

学习OpenCV的学习笔记系列之-- 环境配置

要想学好OpenCV,首先当然要知道怎么配置环境了.以本人的配置环境为例,步骤如下. 第一步 下载及解压OpenCV源码 虽然很多第三方网站及一些学习论坛会提供OpenCV的源码下载,但是还是推荐到官网进行下载,这样可以避免很多麻烦!(病毒?木马?你懂得!) 官网的下载地址如下: http://opencv.org/downloads.html 在此地址的界面上可以找到最新版本的OpenCV源码.我使用的是2014-04-25更新的2.4.9版本(目前最新),根据自己的系统选择对应的源码版本.

七、LED将为我闪烁:控制发光二级管 ——学习笔记

第七章LED将为我闪烁:控制发光二级管 ——学习笔记 1.LED驱动的实现原理 Linux驱动与硬件交互的原理:Linux驱动与I/O内存通过ioread30和iowrite32函数交互:I/O内存与硬件,内存管理模块负责同步I/O内存与硬件中德数据. 解释:尽管 Linux 驱动直接与硬件打交道,但并不是 Linux 驱动直接向硬件中的内存写数据 而是与 本机的 I/0 内存(νO Memory ,位于内核空间〉进行交互.所谓 1/0 内存是通过各种接口(PCI . USB .蓝牙.以太网口等

学习OpenCV的学习笔记系列之-- 环境配置2

要想学好OpenCV,首先当然要知道怎么配置环境了.以本人的配置环境为例,步骤如下. 第一步 下载及解压OpenCV源码 虽然很多第三方网站及一些学习论坛会提供OpenCV的源码下载,但是还是推荐到官网进行下载,这样可以避免很多麻烦!(病毒?木马?你懂得!) 官网的下载地址如下: http://opencv.org/downloads.html 在此地址的界面上可以找到最新版本的OpenCV源码.我使用的是2014-04-25更新的2.4.9版本(目前最新),根据自己的系统选择对应的源码版本.

Spring视频学习笔记(二)

Spring视频学习笔记(二) XML配置里的Bean自动装配(三个来测试实现) /** * Person类 * */ public class Person { private String name; private Address address; private Car car; public String getName() { return name; } public void setName(String name) { this.name = name; } public Ad

OpenCV的学习笔记

整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN 数量:55篇博文 网址:http://blog.csdn.net/column/details/opencv-manual.html 2:部分OpenCV的函数解读和原理解读 作者:梦想腾飞 数量:20篇博文 网址:http://blog.csdn.net/xidianzhimeng/article/category/

OpenCV(学习笔记6)-视频读取与显示

视频的读取主要利用了OpenCV 中的VideoCapture类.并且还可以对摄像头进行调用. VideoCapture类的中提供读入视频的方法有两种. 先实例化再初始化 VideoCapture capture; capture.open("Sugar.avi"); 在实例化的同时进行初始化 VideoCapture capture("Sugar.avi"); 视频读入到VideoCapture类对象之后,紧接着可以利用一个循环对每一帧进行显示出来. Sugar.

机电传动控制课程第一周学习笔记

机电传动课程第一周学习笔记 本周的学习内容主要是第一章绪论和第二章机电传动系统的动力学基础,结合课程学习和预习复习回顾内容如下: 1.绪论:学习了机电传动控制目的与任务.发展历程和我们该如何学习这门课程. 2.机电传动系统的动力学基础: a.运动方程式:对于单一拖动系统或者多拖动系统,在分析时一般都折算到一根轴(电动机轴)上,折算的基本原则是,折算前的多轴系统同折算后的单轴系统在能量关系上或功率关系上保持不变.而对于单 走拖动系统的运动方程式如下. b.判断TM/TL的符号:主要概括为三条:规定

ICMP:Internet控制报文协议实现学习笔记

ICMP是网络层的一个协议,可以看作IP协议的附属协议,因为它主要被IP用来与其他主机或路由器交换错误报文及其他需要注意的信息.当然,更高层协议(tcp/udp)甚至有些用户进程也可能用到ICMP报文 注册ICMP协议和ICMP协议的处理涉及以下文件: net/ipv4/icmp.c ICMP协议处理入口 net/ipv4/af_inet.c 网络层和传输层接口 ICMP报文结构 参见tcp/ip协议学习笔记(5)Internet Control Message Protocol(ICMP) 注

机电传动控制第七周学习笔记——PLC

上周末体测所以忘了写每周的学习笔记(⊙﹏⊙),所以我先行卖个萌. PLC算是不可不知的一类控制方式了,现在开始正式地学习它让我感到很激动.然而老师上课给了习题做,所以错过了一些课程内容,不过学习笔记嘛,课后自学的和查阅的应该也算. 一.基本构成 1.电源部件 可编程逻辑控制器的电源在整个系统中起着十分重要的作用.因为中央处理单元等等用的都是直流电,而且还需要电源部件消除电压波动,温度变化对输出电压的影响等等,保护元件.电源内部还有备用电池防止断电时RAM信息丢失. 2.中央处理单元(CPU) 中