opencv学习笔记二——VideoCapture类实现播放视频滑动条(c++,详细注释)

本人c++小白,初学opencv,如您对代码有更好的意见。欢迎斧正!

VideoCapture类

VideoCapture 类提供了C++ API,主要用来处理视频文件、图像序列或者摄像机实时拍摄的画面

先来了解VideoCapture的各种API φ(≧ω≦)♪*

VideoCapture();//默认的构造函数
VideoCapture (const String &filename);//打开视频文件或者摄像设备或者IP视频流

VideoCapture (const String &filename, int
apiPreference);使用API来打开视频文件或者摄像设备或者IP视频流

VideoCapture (int index);//打开摄像机

virtual ~VideoCapture ();//析构函数

virtual double get (int propId) const;//获取视频的一些属性

virtual bool grab ();// 提取视频的下一帧

virtual bool isOpened () const;// 确认视频捕捉已初始化

virtual bool open (const String &filename);//打开视频文件或者摄像设备或者IP视频流

virtual bool open (int index);//打开摄像机

bool open (int cameraNum, int apiPreference);//打开摄像机

virtual bool open (const String &filename, int
apiPreference);//使用API来打开视频文件或者摄像设备或者IP视频流

virtual VideoCapture & operator>> (Mat &image);// 使用流运算符来读取视频下一帧;

virtual VideoCapture & operator>> (UMat &image);// 使用流运算符来读取视频下一帧;

virtual bool read (OutputArray image);// 提取、解码并返回视频下一帧

virtual void release ();// 关闭视频或捕捉设备

virtual bool retrieve (OutputArray image, int
flag=0);//解码并返回所提取的视频帧

virtual bool set (int propId, double value);// 设置属性

下面总结一下通用属性标识符(比较全)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
问题来了,那么如何实现滑动条呢?(⊙⊙?)
来了解几个函数

int createTrackbar(const string& trackbarname, const string& winname, int* value, int count, TrackbarCallback onChange=0, void*userdata=0)
void setTrackbarPos(const String& trackbarname, const String& winname, int pos)
void setTrackbarPos(const String& trackbarname, const String& winname, int pos)
  • trackbarname:创建的滑动条名。
  • winname:滑动条的父窗体名。
  • value:滑动条当前值。
  • count:允许的最大值,最小值为0。
  • onChange:回调函数,当滑动条位置发生变化时,调用此函数。函数形如void Foo(int,void*);,第一个是位置值,第二个是userdata
  • userdata:可以被传递给回调函数,可以在没有全局位置变量时起作用。(有默认值,一般不填)
  • pos:滑块新位置。

想实现滑动条还需有一个重要的函数O(∩_∩)O (从下方代码中理解)
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

  • 效果图:

在这里插入图片描述在这里插入图片描述
可以得到该视频的总帧数为675,每帧宽度为720,高度为1280.

  • 代码实现
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;

int g_slider_position = 0;//全局变量,用于creatTrackbar()函数中的第三个参数,初始化阈值
VideoCapture g_cap;//创建VideoCapture类对象g_cap
//回调函数
void onTrackbarSlide(int pos, void*) {
	g_cap.set(cv::CAP_PROP_POS_FRAMES, pos);//设置属性
}

int main() {
	cv::namedWindow("pipihan21", CV_WINDOW_NORMAL);//创建窗口
	g_cap.open("C:/Users/xihua/Videos/Captures/动漫.avi");//读取视频
	int frames = (int)g_cap.get(cv::CAP_PROP_FRAME_COUNT);//得到视频总帧数
	int tmpw = (int)g_cap.get(cv::CAP_PROP_FRAME_WIDTH);//得到视频每一帧的宽度
	int tmph = (int)g_cap.get(cv::CAP_PROP_FRAME_HEIGHT);//得到视频每一帧的高度
	cout << "Video has" << frames << "frames of dimensions(" << tmpw << "," << tmph << ")." << endl;
	cv::createTrackbar("阈值", "pipihan21", &g_slider_position, frames, onTrackbarSlide);//creatTrackbar()函数实现滑动条的创建
	cv::Mat frame;//定义一个Mat类对象frame,用于储存每一帧图像
	while (1) {
			g_cap >> frame;//读取当前帧
			if (frame.empty())//判断当前帧是否为空
				break;
			int current_pos = (int)g_cap.get(CAP_PROP_POS_FRAMES);//获取滑条的当前位置
			setTrackbarPos("阈值", "pipihan21", current_pos);//设置滑动条的新位置,从而实现滑动条的跟随
			imshow("pipihan21", frame);//显示图像
		
		char c = (char)cv::waitKey(33);//若33毫秒内按下键,字符c储存该键
		if (c == 27) //“Esc”的ASKII为27
		{
			destroyWindow("pipihan21");//销毁窗口
			cout << "成功销毁窗口" << endl;
			break;
		}
	}
	cv::destroyWindow("pipihan21");
	cout << "成功销毁窗口" << endl;
	return 0;
}
发布了11 篇原创文章 · 获赞 3 · 访问量 1298

猜你喜欢

转载自blog.csdn.net/pipihan21/article/details/104420435