今天我们来做个有趣的程序实现:利用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. submit 后台运行代码

    if EX_TABLE-matnr is not initial and EX_TABLE-KUNDE is not initial.       wa_rspar-selname = 'MATNR' ...

  2. javascript (js)判断手机号码中国移动、中国联通、中国电信

    我国使用的手机号码为11位,其中各段有不同的编码方向:前3位———网络识别号:第4-7位———地区编码:第8-11位———用户号码. 中国移动134.135.136.137.138.139.150.1 ...

  3. Amoeba+Mysql实现数据库读写分离

    一.Amoeba 是什么 Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发.座落与Client.DB Server(s)之间.对客户端透明.具有负载均衡.高可用性.sql过滤.读写分离 ...

  4. python splinter

    from splinter.browser import Browser with Browser() as b: for url,name in web: b.visit(url) b.fill(' ...

  5. struts2请求的URL的搜索路径的顺序概述

  6. Zabbix(二)--第一台主机监控及触发器

    0x01 Create Host 安装完zabbix后从哪里入手?无非就是要添加监控目标,那本文就从添加监控一个主机入手,了解zabbix的各个基本功能 添加主机在“Configuration”选项卡 ...

  7. 十分钟使用github pages +hexo拥有个人博客

    最近想自己搭建自己的个人博客,毕竟这样觉得比较geek,但是搜了资料,感觉良莠不齐,好多东西说的含糊不清,于是自己记录下自己的搭建过程. 1, 安装nodejs 2, 安装git 3, 申请githu ...

  8. C++ exe调用dll文件

    生成dll程序 extern "C"_declspec(dllexport) void maopao(int *p,int count);void maopao(int *p,in ...

  9. 当我我们用new操作符创建对象的时候,都发生了些什么?

    //下面这段代码是javascript设计模式与开发实践上的一段代码 function Person( name ){            this.name = name;        };   ...

  10. 【java】:通用小知识

    1.将String字符串放在最前面 为了防止偶发性的NullPointerException 异常,我们通常将String放置在equals()函数的左边来实现字符串比较,如下代码: // Bad i ...