采用opencv330、VS2017实现视频播放,含滚动条功能

本文档提供了一个使用OpenCV3.3.0和Visual Studio 2017实现视频播放的简单示例,包括在播放过程中添加进度条功能。通过创建视频捕捉对象,设置窗口和进度条,实现了对视频帧的控制,包括单步播放和连续播放。用户可以通过键盘输入's'进行单步播放,输入'r'进行连续播放,按Esc键退出程序。
摘要由CSDN通过智能技术生成
//Mat停留太久会卡住,转到Mat定义处 然后把Mat类和
//上面一大截注释之间加一个空格(直接删除也可以)这样鼠标放在Mat上时就不会有注释预览了。
// Show_Video.cpp: 定义控制台应用程序的入口点。
//A simple example OpenCV program for playing a video file from disk
#include "stdafx.h"
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
#include<fstream>  //文件操作头文件
using namespace cv;
using namespace std;
/*
int main()
{
 namedWindow("Example2",WINDOW_AUTOSIZE); //创建一个可变大小的窗口
 VideoCapture cap;     //创建一个视频捕捉对象
 cap.open("D:\\BaiduNetdiskDownload\\中国特色社会主义领导核心理论.mp4");  //打开对应路径下的图片
 Mat frame;       //定义图像帧frame
 for (;;)       //可以用while(1) 代替, 开始读取视频帧,并连续播放
 {
  cap >> frame;   //载入图像
  if (frame.empty()) break; //播放完毕退出
  
  imshow("Example2", frame);   //把图像填充到窗口Example2里
  //以33ms的速度显示图像帧,即每秒30帧的速度
  if (waitKey(33) >= 0) break;  //如果播放过程中有按键按下,直接退出
 
 }
    return 0;
}
*/
//改进版本,添加进度条
int g_slider_position = 0;
int g_run = 1, g_dontset=0;//start out in single step mode
VideoCapture g_cap;   //创建全局变量g_cap,视频捕捉对象
void onTrackbarSlide(int pos,void *) {
 g_cap.set(CAP_PROP_POS_FRAMES,pos);
 if (!g_dontset)
  g_run = 1;
 g_dontset = 0;
}
int main(int argc, char **argv) {
 
 namedWindow("Video_show1.2",WINDOW_AUTOSIZE);  //初始化,创建一个窗口,可随着图片大小自由变化
 g_cap.open("D:\\BaiduNetdiskDownload\\中国特色社会主义领导核心理论.mp4");  //打开对应路径下的文件
 //读入文件的信息: 总帧数、每张图片的宽和高
 int frames = (int)g_cap.get(CAP_PROP_FRAME_COUNT);
 int tmpw = (int)g_cap.get(CAP_PROP_FRAME_WIDTH);
 int tmph = (int)g_cap.get(CAP_PROP_FRAME_HEIGHT); 
 //输出视频的帧数以及尺寸大小
 cout << "Videos has " << frames << " frames of dimensions(" << tmpw << "×" << tmph << ")" << endl;
   
 //为窗口创建进度条
 //初始位于0,一共的帧数,当前位置随着画面移动而改变
 createTrackbar("Position","Video_show1.2",&g_slider_position,frames,onTrackbarSlide);
 //如果没有加入自定义函数无法实现各种按键的功能,或者说不连续,有BUG
    // createTrackbar("Position", "Video_show1.2", &g_slider_position, frames);
 Mat frame;  //创建Mat类的一个图像帧对象
 for (;;)    //开始读取视频
 {
  if (g_run != 0)
  {
   g_cap >> frame;  //载入图片
   
   if (frame.empty())
   
    break; //播放完毕退出
   int currrent_pos = (int)g_cap.get(CAP_PROP_POS_FRAMES);//当前进度条位置
   g_dontset = 1;
   //设置当前位置与图像帧的位置相对应
   setTrackbarPos("Position","Video_show1.2", currrent_pos);
   imshow("Video_show1.2",frame);
   g_run -= 1;
  }
  //按键功能:  's':单步运行  ;'r':直接运行;  “esc”;直接退出
  char c = (char)waitKey(10);
  if (c == 's')//single mode
  {
   g_run = 1;
   cout << "single step,run=" << g_run << endl;
  }
  if (c == 'r') //run mode
  {
   g_run = -1;
      cout<<"run mode,run="<<g_run<<endl;
  }
  if (c == 27)
   break;
 }
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值