C++读取视频,跳帧保存_c读取视频文件_愿望是当打工人的博客-程序员资料

#include"VideoSave.h"


#ifdef OPENCV
using std::cerr;
using namespace std;



cv::VideoCapture* get_capture_video_stream(const char* path) {
    
	cv::VideoCapture* cap = NULL;
	try {
    
		cap = new cv::VideoCapture(path);
	}
	catch (...) {
    
		cerr << " OpenCV exception: video-stream " << path << " can't be opened! \n";
	}
	return cap;
}



void Video::demo(const char* filename, int frame_skip, const char* out_filename)
{
    

	srand(2222222);
	cv::VideoCapture* cap = NULL;
	char* file;
	if (filename) {
    
		printf("Video file: %s\n", filename);
		cap = get_capture_video_stream(filename);

		char drive[_MAX_DRIVE];
		char dir[_MAX_DIR];
		char fname[_MAX_FNAME];
		char ext[_MAX_EXT];

		_splitpath(filename, drive, dir, fname, ext);

		printf("Drive:%s\n file name: %s\n file type: %s\n", drive, fname, ext);
		file = fname;
	}


	if (!cap) {
    
#ifdef WIN32
		printf("Check that you have copied file opencv_ffmpeg340_64.dll to the same directory where is darknet.exe \n");
#endif
		printf("Couldn't connect to webcam.\n");
		exit(EXIT_FAILURE);
	}



	//获取整个帧数
	long totalFrameNumber = cap->get(cv::CAP_PROP_FRAME_COUNT);
	cout << "Total frames:" << totalFrameNumber << "帧" << endl;


	//设置开始帧()
	long StartFrame = 1;
	cap->set(cv::CAP_PROP_POS_FRAMES, StartFrame); //从设定的帧开始读
	//cap->set(cv::CAP_PROP_POS_MSEC, double(0));  //从设定的时间开始读
	cout << "StartFrame:" << StartFrame << endl;

	//设置结束帧
	int StopFrame = 10;

	if (StopFrame < StartFrame)
	{
    
		cout << "结束帧小于开始帧,程序错误,即将退出!" << endl;
		exit(EXIT_FAILURE);
	}
	else
	{
    
		cout << "结束帧为:第" << StopFrame << "帧" << endl;
	}

	//获取帧率
	double rate = cap->get(cv::CAP_PROP_FPS);
	cout << "帧率为:" << rate << endl;


	//定义一个用来控制读取视频循环结束的变量
	bool stop = false;

	//实例化帧
	cv::Mat frame;

	//显示每一帧的窗口
	//namedWindow( "Extractedframe" );

	//两帧间的间隔时间:
	//int delay = 1000/rate;
	int delay = rate;


	//利用while循环读取帧
	//currentFrame是在循环体中控制读取到指定的帧后循环结束的变量
	long currentFrame = StartFrame;


	while (!stop)
	{
    
		//读取下一帧
		if (!cap->read(frame))
		{
    
			cout << "读取视频失败" << endl;
			exit(EXIT_FAILURE);
		}


		//cout << "正在读取第" << currentFrame << "帧" << endl;
		cv::imshow("Extractedframe", frame);

		//此处为跳帧操作
		if (currentFrame) 
		//此处为帧数间隔,修改这里就可以了 隔50帧保存一帧就是 currentframe%50 == 0
		{
    
			cout << "正在写第" << currentFrame << "帧" << endl;
			stringstream str;
			str << filename << "_" << currentFrame << ".png";        /*图片存储位置*/
			//str << file << "_" << currentFrame << ".png";


			cout << str.str() << endl;
			cv::imwrite(str.str(), frame);
		}

		waitKey(intdelay=0)当delay≤ 0时会永远等待;当delay>0时会等待delay毫秒
		当时间结束前没有按键按下时,返回值为-1;否则返回按键
		//int c = cv::waitKey(0);
		按下ESC或者到达指定的结束帧后退出读取视频
		//if ((char)c == 27 || currentFrame > StopFrame)
		//{
    
		//	stop = true;
		//}
		按下按键后会停留在当前帧,等待下一次按键
		//if (c >= 0)
		//{
    
		//	cv::waitKey(0);
		//}
		if (currentFrame > StopFrame)
		{
    
			stop = true;
		}
		currentFrame++;

	}

	//关闭视频文件
	cap->release();
	cv::waitKey(0);
	cv::destroyAllWindows();

}
#else
void demo(char* cfgfile, char* weightfile, float thresh, float hier_thresh, int cam_index, const char* filename, char** names, int classes, int avgframes,
	int frame_skip, char* prefix, char* out_filename, int mjpeg_port, int dontdraw_bbox, int json_port, int dont_show, int ext_output, int letter_box_in, int time_limit_sec, char* http_post_host,
	int benchmark, int benchmark_layers)
{
    
	fprintf(stderr, "Demo needs OpenCV for webcam images.\n");
}
#endif

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40557160/article/details/118248685

智能推荐

Kafka(5)——JavaAPI十道练习题_BigData菜鸟的博客-程序员资料

以下kafka集群的节点分别是node01,node02,node03习题一:在kafka集群中创建student主题 副本为2个,分区为3个 生产者设置: 设置key的序列化为 org.apache.kafka.common.serialization. StringSerializer 设置value的序列化为org.apache.kafka.common.serializatio...

计算机专业发SCI还是会议,CCF会议会被SCI收录吗_淳于祾湘的博客-程序员资料

CCF会议会被SCI收录。中国计算机学会(CCF)成立于1962年,全国一级学会,独立社团法人,中国科学技术协会成员。CCF是中国计算机及相关领域的学术团体,宗旨是为本领域专业人士的学术和职业发展提供服务;推动学术进步和技术成果的应用;进行学术评价,引领学术方向;促进技术和产业应用一线的交流和互动;对在学术和技术方面有突出成就的个人、企业和单位给予认可和表彰。秉承会员构成、会员治理和服务会员的理念...

吃透Java基础八:Throwable异常_fillinstacktrace作用_吃透Java的博客-程序员资料

一:关于异常JAVA异常是在java程序运行的时候遇到非正常的情况而创建的对,它封装了异常信息。java异常的根类为java.lang.Throwable,整个类有两个直接子类java.lang.Error和java.lang.Exception。Error是程序本身无法恢复的严重错误,一般是虚拟机或者系统运行出现错误,和程序无关。Exception则表示可以被程序捕获并处理的异常错误。JV...

数组shift方法_数组shift()方法以及JavaScript中的示例_cumtb2002的博客-程序员资料

数组shift方法 JavaScript shift()方法 (JavaScript shift() method)shift() method is used to remove the first element of an array and returns the deleted element. shift()方法用于删除数组的第一个元素,并返回删除的元素。 It changes ...

CFile::Open的一些使用说明_wangx_x的博客-程序员资料

CFIIE类是MFC的文件类的基类,它直接提供无缓冲的二进制磁盘I/O设备,并且通过它的派生类可以提供对text文件和内存文件的存取。CFILE与CArchive类一起提供对MFC序列化的支持。CFILE类和它的派生类之间的等级关系,允许你的程序通过多态的CFILE界面对所有文件类进行操作。比如内存文件,或者磁盘文件以及类似的。CFILE和它的派生类用于执行一般的磁盘I/O操作。而OFSTRE...

5. 图像混合(OpenCV基础课程视频学习)_图像乘以权重_Chris Kang的博客-程序员资料

课程视频链接:https://www.bilibili.com/video/av29600072?p=6内容线性混合操作理论知识相关 API (addWeighted)完整代码1. 线性混合操作理论知识g(x) = (1-α) * f_0(x) + α * f_1(x)其中 f0(x) 表示一幅图像,f1(x) 表示另一幅图像, α 表示权重,取值范围在 0~1 之间,所以最后...

随便推点

基于Jenkins实现持续集成【持续更新中】_weixin_30909575的博客-程序员资料

持续集成1.什么是持续集成:Continuous integration (CI)持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。2.没有持续集成的...

esxi中的虚拟机安装vmware tools_weixin_34253539的博客-程序员资料

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

vc下的socket编程【1】_weixin_34174422的博客-程序员资料

基于TCP的socket编程服务器端程序:1、创建socket2、将套接字绑定到一个本地地址和端口上bind3、将套接字设为监听模式,准备接受客户请求listen4、等待客户请求到来;当请求到来后,结合搜此次连接的套接字accept5、用返回的套接字和客户端进行通信send/recv6、返回,等待另一客户请求。7、关闭套接字。源码:#include &lt;Win...

bc命令_普通网友的博客-程序员资料

bc命令是一种支持任意精度的交互执行的计算器语言。bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下。语法bc(选项)(参数)选项-i:强制进入交互式模式;-l:定义使用的标准数学库;-w:对POSIX bc的扩展给出警告信息;-q:不打印正常的GNU bc环境信息;-v:显示指令版本信息;-h:显示指令的帮助信息...

Cesium坐标转换:根据两个坐标点(坐标点a、坐标点b)的经纬度,计算a点和b点的角度_cesium方向计算_zy123698745的博客-程序员资料

计算a点和b点的角度(偏行角:逆时针) /** * 计算a点和b点的角度(偏行角) * @param lng_a a点经度 * @param lat_a a点维度 * @param lng_b b点经度 * @param lat_b b点维度 * @returns 角度 */function courseAngle(lng_a, lat_a, lng_b, lat_b)...

编译curl for android_brycezou的博客-程序员资料

build curl for androidexport CURL_BUILD_DIR=/xxxx/curl-7_53_1/4androidexport CC=arm-linux-androideabi-gccexport CXX=arm-linux-androideabi-g++export LINK=$CXXexport LD=arm-linux-androideabi-ldexport

推荐文章

热门文章

相关标签