今天我们来做个有趣的程序实现:利用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. iOS 键盘类型

    版权声明:本文为博主原创文章.请尊重作者劳动成果,转载请注明出处. UIKeyboardTypeDefault: UIKeyboardTypeASCIICapable: UIKeyboardTypeN ...

  2. C# 去除字符串首尾字符或字符串

          在做一个属性入库的功能,将Excel属性数据导入到图层要素当中,这里Excel和SDE数据库数据存在一个关联字段,通过关联字段值进行匹配属性入库.       在实际业务中,由于普查数据往 ...

  3. C#(asp.net )读取ASHX文件(一般处理程序)

    c#后台获取asxh的返回数据,后台创建一个请求实例,获取请求实例的返回值 public string GetResponseByPost(string apiUrl, string queryStr ...

  4. thinkpad e450 win7黑苹果macos 10.10.5(网/显/声卡驱动)安装成功

    首先上图: 过程: 1.使用变色龙安装macos 10.10.5懒人版黑苹果 2.使用Haswell破解内核替换,成功进入系统 2.5.使用Hackintosh Vietnam Tool 1.9.6以 ...

  5. Visual Studio 实现 编写一套.net代码,同时编译到 多个平台,多版本的操作笔记

    如题,把一套代码.NET代码.编译成多平台,多版本dll文件. 项目结构如图(Cvs文件读写开源组件 https://github.com/JoshClose/CsvHelper) 如上图.项目工程  ...

  6. jquery 清空 iframe 的内容,,iframe自适应高度

    $(iframe).contents().find("body").html(""); iframe自适应高度 $("#AllDescription& ...

  7. 通过 UDP 发送数据的简单范例

    package j2se.core.net.udp; import java.io.IOException;import java.net.DatagramPacket;import java.net ...

  8. jQuery插件编写笔记

    插件的种类: 1.封装对象方法的插件. 2.封装全局函数的插件. 3.选择器插件. *所有的对象方法都应当附加到jQuery.fn对象上,而所有的全局函数都应当附加到jQuery对象本身上. *在插件 ...

  9. 用ajax动态获取数据显示在highcharts上

    html代码(index.html) <html><head> <meta charset="UTF-8" /> <title>Hi ...

  10. C#方法中三个重要的参数:out、ref、params

    备注:适用于初学者,自学于传智播客. 1.out参数. 概念:如果在一个方法中,返回多个相同类型值的时候,可以考虑返回一数组.但是返回多个不同类型值的时候,返回数组显然不能解决问题,这时就引入out参 ...