今天我们来做个有趣的程序实现:利用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等
  • 只分配一帧的图像空间,每次调用时覆盖前面一次的数据(每次调用返回的指针是一样的)
  • 倘若我们想分配自己的图像存储空间用:cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,3)-《笔记一》
  • 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 =; //定义一个全局变量,控制滚动条的位置
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 == )
{ cvNamedWindow("Example2",);
g_capture = cvCaptureFromAVI(argv[]);
                                       // cvCreateFileCapture(argv[1]); 读入AVI文件等价
int frames = (int) cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);
//获取视频文件属性的总帧数
if(frames != )
{
/* "position"表示滚动条的名词,"Example3"表示滚动条所属窗口,
g_slider_position表示滚动条当前位置。 frames表示滚动条的最大值,
onTrackbarSlide表示滚动条的回调函数(被拖动时调用) */ cvCreateTrackbar("Position","Example2",&g_slider_position,frames,onTrackbarSlide);
} IplImage* frame = NULL ;
while() //实时捕捉视频帧显示,并且更新进度条
{
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(); //按下esc后退出
if( c == )break; }
}
cvReleaseCapture(&g_capture);
cvDestroyWindow("Example2");
return ;
}

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

  1. OpenCV入门学习笔记

    OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...

  2. Android NDK开发及OpenCV初步学习笔记

    https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...

  3. OpenCV图像处理学习笔记-Day1

    OpenCV图像处理学习笔记-Day1 目录 OpenCV图像处理学习笔记-Day1 第1课:图像读入.显示和保存 1. 读入图像 2. 显示图像 3. 保存图像 第2课:图像处理入门基础 1. 基本 ...

  4. OpenCV图像处理学习笔记-Day03

    OpenCV图像处理学习笔记-Day03 目录 OpenCV图像处理学习笔记-Day03 第31课:Canny边缘检测原理 第32课:Canny函数及使用 第33课:图像金字塔-理论基础 第34课:p ...

  5. OpenCV图像处理学习笔记-Day4(完结)

    OpenCV图像处理学习笔记-Day4(完结) 第41课:使用OpenCV统计直方图 第42课:绘制OpenCV统计直方图 pass 第43课:使用掩膜的直方图 第44课:掩膜原理及演示 第45课:直 ...

  6. 视频文件写入转换之图像处理-OpenCV应用学习笔记五

    在<笔记二>中我们做了视频播放和控制的实现,仅仅算是完成了对视频文件的读取操作:今天我们来一起练习下对视频文件的写入操作:格式转换. 实现功能: 打开一个视频文件play.avi,读取文件 ...

  7. OpenCV学习笔记(二) - 写入视频、jpg格式

    写入视频: import sys, os import cv2 imgDir = '/Users/xxx/salient/' videoName = 'vname' fps = 30 #帧频 outp ...

  8. opencv的学习笔记5

    总结原博文中的一些边缘检测算子和滤波器.(Canny算子,  Sobel算子,  Laplace算子以及Scharr滤波器) 首先,一般的边缘检测包括三个步骤: 1)滤波:边缘检测的算法主要是基于图像 ...

  9. opencv的学习笔记3

    CMake是一个比make更高级的编译配置工具,它可以根据不同平台.不同的编译器,生成相应的Makefile或者vcproj项目.通过编写CMakeLists.txt,可以控制生成的Makefile, ...

随机推荐

  1. WebMethod在webservice里面非静态方法能调用,在页面类里面,静态方法才能调用

    WebMethod在webservice里面非静态方法能调用,在页面类里面,静态方法才能调用

  2. python学习之——pip的安装与使用

    安装步骤: 前提:已经安装python 1.下载安装包并解压: easy_install 地址:https://pypi.python.org/pypi/setuptools#downloads pi ...

  3. poj -- 1042 Gone Fishing(枚举+贪心)

    题意: John现有h个小时的空闲时间,他打算去钓鱼.钓鱼的地方共有n个湖,所有的湖沿着一条单向路顺序排列(John每在一个湖钓完鱼后,他只能走到下一个湖继续钓),John必须从1号湖开始钓起,但是他 ...

  4. Golang 文件服务器小结

    花了一个星期学习文件服务器,老是在一些地方搞混,整理一下所学的,清晰了不少. 学Go半个月,还有很多不懂的地方,有理解错误的,还望高手指出. 注:以下代码中,w为http.ResponseWriter ...

  5. 5. Singleton(单例)

    意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 适用性: 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代 ...

  6. PIL show() 报错

    将 PIL 安装目录下的 ImageShow.py 文件的第 99 行:(我的 Python 安装在 D:\Program Files\python 2.6,那  ImageShow.py  文件在: ...

  7. js继承

    js继承有5种实现方式: 继承第一种方式:对象冒充 function Parent(username){ this.username = username; this.hello = function ...

  8. sed笔记

    sed是stream editor缩写,表示流编辑器,它是一款文本处理工具,可以配合正则表达式进行文本替换. 1.使用正则表达式匹配并进行文本中的字符串替换 *使用-i选项可以直接将替换结果应用到源文 ...

  9. Windows结构化异常

    不错的总结: http://hi.baidu.com/wangxvfeng101/item/518f6efdab4e5616ff35820e http://www.vckbase.com/index. ...

  10. CM+CDH安装遇到的问题

    1.实在是在安装CDH的时候无法安装成功的话,只有重新启动了,下面给大家分享一个神器,按照这个脚本应该差不多就能卸载干净,然后重新安装,写一个脚本,内容如下,救命的神器呀: #!/bin/bash s ...