#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?有谁知道,告诉我一下。