Videocapture类原理及示例

程序功能:
1.用户可以选择连续播放视频,输出一帧后用户再来决定下一帧如何播放(单帧模式),退出
2.同时支持用户设定下拉框显示确切位置的图像帧
存在问题:
控制台无法获取输入
下滑条回调函数理解不全面
读取视频流的videoCapture类功能没有完全理解,等我学过之后来补充。。。

#include <opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;

VideoCapture g_cp;
int g_pos=0;//下拉框位置
int g_dontset = 1;//回调函数,当选择下拉框,进入单步模式
int g_run = 1;//代表单步显示图像帧 刚开始是单步

void onTrack(int pos,void *) {//trackbar 当改变滑动条的位置,参数pos代表新的条形框的位置,将执行该函数,考虑两种情况:用户拉动条形框和视频播放条形框位置的变化所触发的set方法
	g_cp.set(CV_CAP_PROP_POS_FRAMES,pos);

	if (g_dontset == 0)//用户选择了滑动条,进入单步
	{
		g_run = 1;
	}
	g_dontset = 0;

}


int main(int argc,char** argv) {
	g_cp.open("F:\\video.avi");
	int frameCount=g_cp.get(CV_CAP_PROP_FRAME_COUNT);
	namedWindow("player with trackBar", WINDOW_AUTOSIZE);
	createTrackbar("trackbar", "player with trackBar",&g_pos, frameCount,onTrack);//在窗口上生成一个trackbar
	Mat frame;

	while (1) {

		if (g_run != 0)//控制是否继续播放 单步停止 等待用户指令输入 连播继续播放
		{
			g_cp >> frame;
			if (frame.empty())break;
			int pos = g_cp.get(CV_CAP_PROP_POS_FRAMES);//获取视频流当前帧的位置
			g_dontset = 1;
			cvSetTrackbarPos("trackbar", "player with trackBar", pos);//设置bar位置,此时会引发一次bar的回调
			imshow("player with trackerBar", frame);
			g_run -= 1; //单步模式结束 ,连播模式继续
		}

		//针对单步播放 ,用户选择下一张图像播放方法
		//每次在窗口上显示过一张图像,针对单步播放方式,让用户选择单步还是连播,对于连播方式,第一个if语句使得视频一直播放直到播放完毕
		char c = (char) waitKey(0);
		if (c == 's')
			g_run = 1;
		if (c == 'r')
			g_run = -1;
		if (c == 27)//23 代表esc
			break;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37937932/article/details/86507505