OpenCV3视频创建进度条--createTrackbar

createTrackbar

1、createTrackbar(trackbarname,winname,*value,count,onTrackbarSlide)

参数名
trackbarname表示进度条名字
winname表示窗口名字
value表示进度条位置的索引
count表示该视频的最大帧数
onTrackbarSlide表示回调函数

2、TrackbarSlide(pos)

void onTrackbarSlide(int pos, void *)   //pos参数由g_slider_position传递
{
	g_cap.set(cv::CAP_PROP_POS_FRAMES, pos);   //从第pos帧开始
	if (!g_dontset)
		g_run = 1;  //进入单步模式  
	g_dontset = 0;      
}

3、实现代码

#include<opencv2\opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
#include<fstream>
using namespace std;
int g_slider_position = 0;
int g_run = 1, g_dontset = 0;
cv::VideoCapture g_cap;

void onTrackbarSlide(int pos, void *)   //pos参数由g_slider_position传递
{
	g_cap.set(cv::CAP_PROP_POS_FRAMES, pos);   //从第pos帧开始
	if (!g_dontset)
		g_run = 1;  //进入单步模式  
	g_dontset = 0;      
}
int main()
{
	cv::namedWindow("Example2_4", cv::WINDOW_AUTOSIZE);
	g_cap.open("Video1.mp4");
	assert(g_cap.isOpened());
	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("Position", "Example2_4", &g_slider_position, frames, onTrackbarSlide);   //创建一个进度条
	cv::Mat frame;    //用于读取视频流
	for (;;)
	{
		if (g_run != 0) {
			g_cap >> frame;   //从g_cap读取一帧
			if (frame.empty()) break;
			int current_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES);	//获取下一帧的索引值
			g_dontset = 1;	//初始值为0,下一步调用回调函数会判断并且将g_run设置为1,就会导致进入单步模式
			cv::setTrackbarPos("Position", "Example2_4", current_pos);	//设置滚动条位置
			cv::imshow("Example2_4", frame);   //显示一帧图片
			g_run -= 1;
		}
		char c = (char)cv::waitKey(30);   //等待30ms继续执行程序
		if (c == 's')
		{
			g_run = 1; cout << "Single step,run = " << g_run << endl;
		}
		if (c == 'r')
		{
			g_run = -1; cout << "Run mode ,run= " << g_run << endl;
		}
		if (c == 27)  //esc的ascll码
			break;
	}
	return 0;
}

总结:一开始会默认读取一帧然后停止,因为g_run初始值等于1,如果执行单步模式,即每次g_run=1都会读取一帧后停止,每次拖动进度条都会获取到g_slider_position的值。然后调用回调函数获取下一帧,默认进入单步模式。当输入r时,g_run=-1,此时循环会不断进行,直到读取到esc或者s。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要为视频添加进度条,除了利用OpenCV中的VideoCaptureVideoWriter类,还可以使用createTrackbar函数创建一个滑动条,方便用户控制当前播放时间。createTrackbar函数可以创建一个滑动条,并将其绑定到一个回调函数上。当滑动条的值发生改变时,回调函数就会被调用,我们可以在回调函数中更新当前播放时间,并将视频跳转到对应的帧。 下面是一个简单的示例代码,用于在视频帧上添加进度条和滑动条: ```c++ #include <opencv2/opencv.hpp> #include <string> using namespace cv; using namespace std; // 定义全局变量 int currentFrame = 0; int totalFrames = 0; int fps = 0; double currentTime = 0; bool isPlaying = true; // 回调函数:更新当前播放时间 void onTrackbarSlide(int pos, void* userdata) { currentFrame = pos; currentTime = (double)currentFrame / fps; } int main(int argc, char** argv) { // 打开视频文件 VideoCapture cap("input_video.mp4"); if (!cap.isOpened()) { cerr << "Error opening video file" << endl; return -1; } // 获取视频信息 totalFrames = cap.get(CAP_PROP_FRAME_COUNT); fps = cap.get(CAP_PROP_FPS); // 创建输出视频文件 string outputFilename = "output_video.mp4"; VideoWriter writer(outputFilename, VideoWriter::fourcc('M', 'P', '4', 'V'), fps, Size(cap.get(CAP_PROP_FRAME_WIDTH), cap.get(CAP_PROP_FRAME_HEIGHT))); // 创建窗口和滑动条 string windowName = "Video player"; namedWindow(windowName); createTrackbar("Time", windowName, &currentFrame, totalFrames, onTrackbarSlide); // 读取视频帧并添加进度条 Mat frame; while (isPlaying) { cap.read(frame); if (frame.empty()) { isPlaying = false; break; } // 绘制进度条 string timeString = to_string(currentTime); putText(frame, timeString, Point(50, 50), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 255, 0), 2); // 更新滑动条位置 setTrackbarPos("Time", windowName, currentFrame); // 写入视频帧 writer.write(frame); // 更新当前时间和帧数 currentTime = (double)currentFrame / fps; currentFrame++; } // 释放资源 cap.release(); writer.release(); destroyAllWindows(); return 0; } ``` 这个示例代码中,我们首先创建一个窗口和一个滑动条,并将滑动条的回调函数设置为onTrackbarSlide。在回调函数中,我们更新当前帧数和播放时间。在主循环中,我们读取视频帧并添加进度条,然后更新滑动条的位置和当前时间。最后,我们释放资源并结束程序。注意,在主循环中,我们必须检查视频是否已经播放完毕,并在需要停止播放时退出循环。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值