按帧读取视频

#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<iostream>

using namespace std;
using namespace cv;

int main()
{
	//VideoCapture capture("C:\\Users\\801\\Desktop\\Megamind.avi");//F:\\movie_clip\\Mr.Nobody.mkv
	VideoCapture capture("F:\\movie_clip\\Mr.Nobody.mkv");

	if (!capture.isOpened())
	{
		cout<<"fail to open!"<<endl;

	}
	long totalFrameNumber=capture.get(CV_CAP_PROP_FRAME_COUNT);
	cout<<"整个视频"<<totalFrameNumber<<"帧"<<endl;

	//设置开始帧
	long frameToStart=200;
	capture.set(CV_CAP_PROP_POS_FRAMES,frameToStart);
	cout<<"从第"<<totalFrameNumber<<"帧开始读"<<endl;

	//设置结束帧
	int frameToStop =totalFrameNumber;

	if(frameToStop < frameToStart)
	{
		cout<<"结束帧小于开始帧,程序错误,即将退出!"<<endl;
		return -1;
	}
	else if(frameToStop>totalFrameNumber)
	{
		cout<<"结束帧frameToStop为"<<frameToStop<<"大于总的帧数"<<totalFrameNumber<<"所以设置结束帧为:第"<<totalFrameNumber<<"帧"<<endl;
		frameToStop=totalFrameNumber-1;
	}
	else
	{
		cout<<"结束帧为:第"<<frameToStop<<"帧"<<endl;
	}

	//获取帧率
	double rate = capture.get(CV_CAP_PROP_FPS);
	cout<<"帧率为:"<<rate<<endl;

	//定义一个用来控制读取视频循环结束的变量
	bool stop = false;
	//承载每一帧的图像
	Mat frame;
	//显示每一帧的窗口
	//namedWindow("Extracted frame");
	//两帧间的间隔时间:
	int delay = 500/rate;

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

	//滤波器的核
	//int kernel_size = 3;
	//Mat kernel = Mat::ones(kernel_size,kernel_size,CV_32F)/(float)(kernel_size*kernel_size);

	while(!stop)
	{
		//读取下一帧
		if(!capture.read(frame))
		{
			cout<<"读取视频失败"<<endl;
			return -1;	
		}
		int i_name=0;//给保存的视频帧命名
		char filename_0[100]={0};

		//这里加滤波程序
		/*imshow("Extracted frame",frame);*/
		//filter2D(frame,frame,-1,kernel);
		imshow("after filter",frame);
		
		cout<<"正在读取第"<<currentFrame<<"帧"<<endl;
		//waitKey(int delay=0)当delay ≤ 0时会永远等待;当delay>0时会等待delay毫秒
		//当时间结束前没有按键按下时,返回值为-1;否则返回按键


		if(currentFrame==323)
		{
			
			sprintf(filename_0,"C:\\Users\\801\\Desktop\\picture\\%d.jpg",currentFrame);
			imwrite(filename_0,frame);
		}
		int c = waitKey(delay);
		//按下ESC或者到达指定的结束帧后退出读取视频
		if((char) c == 27 || currentFrame == frameToStop)
		{
			stop = true;
		}
		//按下按键后会停留在当前帧,等待下一次按键
		if( c >= 0)
		{
			waitKey(0);
		}
		++currentFrame;

	}
	//关闭视频文件
	//capture.release();
	waitKey(0);
	return 0;
}
废话没说,先上了代码片;

代码功能:给一段视频,按帧读取,设置起始帧和结束帧来进行图像帧的读取;

问题1:

为什么代码会按照我的意思想读取那帧就读那帧,后来分析是因为这句话:

capture.set(CV_CAP_PROP_POS_FRAMES,frameToStart);
问题2:

开始帧的设置问题:

 frameToStart=200;它除了不能大于结束帧以外,还有什么限制了?

在代码中我将它设置为了“-1”,即:

 frameToStart=-1;发现它仍然能正常运行,这是为什么?
我不清楚了,一段视频的起始帧到底是多少?1 or -1 or 0?有谁知道,告诉我一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫与橙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值