这里读取一个视频,然后将视频的每一帧都保存为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++; }
时间: 2024-10-26 21:09:01