Opencv如何实现视频播放与进度控制

这篇文章将为大家详细讲解有关Opencv如何实现视频播放与进度控制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

成都创新互联公司成立于2013年,我们提供高端成都网站建设成都网站制作成都网站设计公司、网站定制、营销型网站建设微信小程序、微信公众号开发、网站推广服务,提供专业营销思路、内容策划、视觉设计、程序开发来完成项目落地,为成都木托盘企业提供源源不断的流量和订单咨询。

视频画面本质上是由一帧一帧的连续图像组成的,播放视频其实就是在播放窗口把一系列连续图像按一定的时间间隔一幅幅贴上去实现的。

人眼在连续图像的刷新最少达到每秒24帧的时候,就分辨不出来图像间的闪动了,使人感觉呈现出来的是连续的画面,视频的播放就是利用了这一点。我们知道,电影被称为“24帧的艺术”,意思就是电影画面每秒刷新24帧,即每秒显示24副图像,它的帧率(Frames per Second,简称:FPS)为24。

一般情况下帧率要大于等于24,以下先测试一下两个视频文件的帧率,一个是网络上下载的“”friends“”,一个是用手机拍摄的视频。

#include "core/core.hpp" 
#include "highgui/highgui.hpp" 
#include "imgproc/imgproc.hpp" 
#include  
 
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: "<

经测试,两个视频文件的帧率都是23.976

Opencv如何实现视频播放与进度控制

播放与进度控制里主要用到 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  
 
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"<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);  //设置当前播放帧 
}

Opencv如何实现视频播放与进度控制

拖动控制条的滑块,实现播放进度控制:

Opencv如何实现视频播放与进度控制

每次拖动滑块位置发生,就会触发定义的“TrackBarFunc”回调函数,这个函数做了两件事,一是

controlRate=(double)trackbarValue/trackbarMax*totalFrame; 
//trackbar控制条对视频播放进度的控制

通过滑块的位置确定视频当前应该播放的帧数;二是

video.set(CV_CAP_PROP_POS_FRAMES,controlRate);  //设置当前播放帧

通过set函数,设置当前播放帧。

在while循环里不断累加当前播放帧变量,当当前播放帧大于总的帧数时,表示视频已经播放到结尾,退出播放。

关于“Opencv如何实现视频播放与进度控制”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


当前名称:Opencv如何实现视频播放与进度控制
分享地址:http://csdahua.cn/article/jsioip.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流