首页 > 代码库 > Duanxx的Opencv学习:将视频转换为图片

Duanxx的Opencv学习:将视频转换为图片

这里读取一个视频,然后将视频的每一帧都保存为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++;
	}


Duanxx的Opencv学习:将视频转换为图片