Opencv中视频播放与进度控制
视频画面本质上是由一帧一帧的连续图像组成的,播放视频其实就是在播放窗口把一系列连续图像按一定的时间间隔一幅幅贴上去实现的。
人眼在连续图像的刷新最少达到每秒24帧的时候,就分辨不出来图像间的闪动了,使人感觉呈现出来的是连续的画面,视频的播放就是利用了这一点。我们知道,电影被称为“24帧的艺术”,意思就是电影画面每秒刷新24帧,即每秒显示24副图像,它的帧率(Frames
per Second,简称:FPS)为24。
一般情况下帧率要大于等于24,以下先测试一下两个视频文件的帧率,一个是网络上下载的“”friends“”,一个是用手机拍摄的视频。
#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
int main(int argc,char *argv[])
{
VideoCapture videoFriends(argv[1]);
VideoCapture videoPhone(argv[2]);
double fpsFriends=videoFriends.get(CV_CAP_PROP_FPS);
double fpsPhone=videoFriends.get(CV_CAP_PROP_FPS);
std::cout<<"FPS of Friends is: "<<fpsFriends<<std::endl;
std::cout<<"FPS of MyPhone is: "<<fpsPhone<<std::endl;
system("pause");
return 0;
}
经测试,两个视频文件的帧率都是23.976
播放与进度控制里主要用到 VideoCapture类里的get()函数,和创建控制条的createTrackbar()函数,get()函数用于获取视频的帧数、帧率等信息,了解get函数的参数含义即可,像get(CV_CAP_PROP_FRAME_COUNT)用于获取总帧数,get(CV_CAP_PROP_FPS)用于获取帧率等。
控制条作为Opencv中一个重要的用户和图像传参、交互的工具,伴随了整个opencv图像处理的过程,之前有提到过,这里有必要再说一说createTrackbar()这个函数。
函数原型
int createTrackbar(const string& trackbarname, const string& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
该函数作用是在指定图像窗口上创建一个控制条,这个控制条具有指定的参数控制范围,可以通过回调函数,执行对应的操作。
第一个参数:const修饰的string类型的引用trackbarname,表示控制条的名称
第二个参数:const修饰的string类型的引用winname,表示控制条所在的图像窗口的名称
第三个参数:int型的指针value,表示滑块的控制位置,拖动控制条滑块的位置,相应的会改变*value的值
第四个参数:int型的count,表示控制条上滑块的最大位置处对应的值
第五个参数:TrackbarCallback类型的onChange,表示一个指向回调函数的指针,每当滑块的位置发生变化,都会触发该回调函数
第六个参数:void型的userdata,一般使用其默认值0
Opencv通过VideoCapture类播放视频与通过createTrackbar创建进度条控制视频播放Code:
#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
Mat image; //读入视频帧的Mat
char* windowName="Video Control"; //播放窗口名称
char* trackBarName="播放进度"; //trackbar控制条名称
double totalFrame=1.0; //视频总帧数
double currentFrame=1.0; //当前播放帧
int trackbarValue=1; //trackbar控制量
int trackbarMax=255; //trackbar控制条最大值
double frameRate=1.0; //视频帧率
VideoCapture video; //声明视频对象
double controlRate=0.1;
//控制条回调函数
void TrackBarFunc(int ,void(*));
int main(int argc,char *argv[])
{
//打开视频文件
video.open(argv[1]);
if(!video.isOpened())
{
std::cout<<"Failed to open video"<<std::endl;
}
totalFrame=video.get(CV_CAP_PROP_FRAME_COUNT); //获取总帧数
frameRate=video.get(CV_CAP_PROP_FPS); //获取帧率
double pauseTime=1000/frameRate; // 由帧率计算两幅图像间隔时间
namedWindow(windowName);
//在图像窗口上创建控制条
createTrackbar(trackBarName,windowName,&trackbarValue,trackbarMax,TrackBarFunc);
TrackBarFunc(0,0);
while (true)
{
video.read(image);
resize(image,image,Size(500,400)); //调整图像大小,视频在我的显示器上显示不全
imshow(windowName,image); //显示图像
waitKey(pauseTime); //图像间隔
controlRate++;
if(controlRate>totalFrame) //播放完成退出
{
break;
}
}
video.release(); //释放视频,C++中不写也无碍,可以自动释放
waitKey();
return 0;
}
void TrackBarFunc(int ,void(*))
{
controlRate=(double)trackbarValue/trackbarMax*totalFrame; //trackbar控制条对视频播放进度的控制
video.set(CV_CAP_PROP_POS_FRAMES,controlRate); //设置当前播放帧
}
拖动控制条的滑块,实现播放进度控制:
每次拖动滑块位置发生,就会触发定义的“TrackBarFunc”回调函数,这个函数做了两件事,一是
controlRate=(double)trackbarValue/trackbarMax*totalFrame; //trackbar控制条对视频播放进度的控制
通过滑块的位置确定视频当前应该播放的帧数;二是
video.set(CV_CAP_PROP_POS_FRAMES,controlRate); //设置当前播放帧
通过set函数,设置当前播放帧。
在while循环里不断累加当前播放帧变量,当当前播放帧大于总的帧数时,表示视频已经播放到结尾,退出播放。
Opencv中视频播放与进度控制的更多相关文章
- opencv 实现进度控制
进度控制: #include <opencv\cv.h> #include <opencv\highgui.h> #include <opencv\cxcore.h> ...
- html5中视频播放问题总结
html5中视频播放问题总结 文章 1.问题一 框架? 加个标签就OK! <video id="video1" src="/video1.mp4" con ...
- Opencv学习笔记——视频进度条的随动
1. CvCapture结构体: CvCapture是一个结构体,用来保存图像捕获的信息,就像一种数据类型(如int,char等)只是存放的内容不一样,在OpenCv中,它最大的作用就是处理视频时(程 ...
- OpenCV中IplImage和Mat间的相互转换
OpenCV中做图像处理经常用到IplImage和Mat间的相互转换. 首先,cv::Mat是opencv2.0中的数据类型:IplImage是opencv1.0中的类型,两种类型并不相同. 1. I ...
- 立体视觉-opencv中立体匹配相关代码
三种匹配算法比较 BM算法: 该算法代码: view plaincopy to clipboardprint? CvStereoBMState *BMState = cvCreateStereoBMS ...
- OpenCV中cv2的用法
一.读入图像 使用函数cv2.imread(filepath,flags)读入一副图片 filepath:要读入图片的完整路径 flags:读入图片的标志 cv2.IMREAD_COLOR:默认参数 ...
- [OpenCV-Python] OpenCV 中的 Gui特性 部分 II
部分 IIOpenCV 中的 Gui 特性 OpenCV-Python 中文教程(搬运)目录 4 图片 目标 • 在这里你将学会怎样读入一幅图像,怎样显示一幅图像,以及如何保存一幅图像 • 你将要学习 ...
- opencv中 int main(int argc,char* argv[])详解
opencv中 int main(int argc,char* argv[])详解 argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数 ...
- OpenCV中Kinect的使用(3)
接OpenCV中Kinect的使用(2),下面内容主要讲述使用OpenNI 控制Kinect 的马达,实现摄像头的上下摆动. 下面是透过OpenNI比较低阶的USB控制介面(XnUSB.h),来做到马 ...
随机推荐
- linux的at定时任务的使用
linux的at定时任务的使用 使用at只能执行一次性任务:使用at命令需要开启atd进程. 以下情况需要安装at命令: 情况1.查看是否开启atd进程:ps -ef | grep atd.[test ...
- 多个ajax执行混乱问题
多个ajax执行混乱问题,之前拿ajax取代iframe做响应布局(左侧点击,右侧展示),当执行多个点击事件时会造成一个页面的初始化触发另一个页面的on click的function, 将ajax调为 ...
- Spring实战Day7面向切面编程术语介绍
#### 面向切面编程 为什么需要切面? 有些功能需要在应用中的多个地方使用到,但是我们又不想在着每个地方都调用他们 切面术语 通知(advice):切面需要完成的工作 通知的类型(什么时间完成工作) ...
- MySQL主从架构配置
MySQL主从架构配置有两台MySQL数据库服务器master和slave,master为主服务器,slave为从服务器,初始状态时,master和slave中的数据信息相同,当master中的数据发 ...
- 中国剩余定理 & 欧拉函数 & 莫比乌斯反演 & 狄利克雷卷积 & 杜教筛
ssplaysecond的博客(请使用VPN访问): 中国剩余定理: https://ssplaysecond.blogspot.jp/2017/04/blog-post_6.html 欧拉函数: h ...
- java.nio.ByteBuffer 以及flip,clear及rewind区别
Buffer 类 定义了一个可以线性存放primitive type数据的容器接口.Buffer主要包含了与类型(byte, char…)无关的功能. 值得注意的是Buffer及其子类都不是线程安全的 ...
- 【Todo】Java8新特性学习
参考这篇文章吧: http://blog.csdn.net/vchen_hao/article/details/53301073 还有一个系列
- ReactNavtive框架教程(3)
原文:http://www.raywenderlich.com/99473/introducing-react-native-building-apps-javascript 注意:全部图片放在了百度 ...
- [转]JVM堆和栈的区别
物理地址 堆的物理地址分配对对象是不连续的.因此性能慢些.在GC的时候也要考虑到不连续的分配,所以有各种算法.比如,标记-消除,复制,标记-压缩,分代(即新生代使用复制算法,老年代使用标记——压缩) ...
- javaproject积累——树形结构的操作
近期一直被树形结构整的非常头大,又是递归.又是循环.可是,好在我们在经历了千辛万苦后.最终弄出来了.事实上就是组织机构的常规操作,有些是我们过度设计.有些是我们想错了.而对数的逻辑读取,我们就属于想错 ...