这里读取一个视频,然后将视频的每一帧都保存为png格式的图片,
本文的代码下载
这里首先要解决的问题是为图片按下标生成名字:
这个函数输入的是对视频中的图像帧的计数,输出的是文件的名字,以png格式保存
名字示例:f00005.png
string nameGenerate(unsigned int frameCounter)
{
unsigned int num = num2str1(frameCounter).length();///<获得数字的位数
assert(num <= 5);///<数值不能大于5位
string temp = ".\\image\\f";///<保存在./image文件夹下面,文件名前缀为f
for (int i = 0;i < 5 - num;i++)
{
temp+="0";///<前面补零
}
temp+=num2str1(frameCounter) + ".png";///<加上png文件名
return temp;
}
///<选择读取用的视频
VideoCapture video(video_file_07);
if (!video.isOpened())
{
cout<<"open failed!"<<endl;
return -1;
}
///< 获得视频的部分参数
int width = 0, height = 0, fps = 0, fourcc = 0;
width = static_cast<int>(video.get(CV_CAP_PROP_FRAME_WIDTH));
height = static_cast<int>(video.get(CV_CAP_PROP_FRAME_HEIGHT));
fps = static_cast<int>(video.get(CV_CAP_PROP_FPS));
fourcc = static_cast<int>(video.get(CV_CAP_PROP_FOURCC));
cout << "Input video: (" << width << "x" << height << ") at " << fps << ", fourcc = " << fourcc << endl;
Mat frame;
int frameCounter = 0;
//creatWindow(windows_name_original,frame,100,100);
namedWindow(windows_name_original);
while (1)
{
video>>frame;///<从视频中读取帧图像
if (frame.empty())///<图像非空,就继续操作
{
break;
}
imshow(windows_name_original,frame);///<显示图像
imwrite(nameGenerate(frameCounter),frame);///<将图像保存
cout<<nameGenerate(frameCounter)<<endl;///<控制台输出已经保存了的图像
waitKey(10);///<这个必须要,否则会出现图像无法显示的现象
///<如果达到指定的帧数,停止读取
if (frameCounter == 405)
{
break;
}
frameCounter++;
}原文地址:http://blog.csdn.net/daunxx/article/details/40400965