这一章的内容:
主要利用了sprintf格式化图片名的小技巧,结合之前读写图片和读写视频的方法,完成了以下三个小应用:
1.批量读取图片(有序),并显示
2.视频分解成图片
3.图片合成视频
代码1:批量读取图片(有序),并显示
///批量读取图片(有序),并显示
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std;
void main()
{
char fileName[50]; //char型数组记录图片名
char winName[50]; //char型数组记录窗口名
Mat srcImg; //定义Mat型变量srcImg
for(int i = 1; i<101; i++) //循环100次,读取100张图片
{
sprintf(fileName, "E:\\pic\\%d.bmp", i);//利用sprintf格式化图片名fileName
sprintf(winName, "NO--%d", i); //利用sprintf格式化窗口名winName
srcImg = imread(fileName); //将名为fileName的图片读进srcImg
if(srcImg.empty()) //对srcImg的异常检测
break;
imshow(winName, srcImg); //在winName窗口显示图片srcImg
}
waitKey(0);
destroyAllWindows();
}
运行结果:读取了E:\pic\中的100张图片(文件名有有序%d.bmp),并显示
代码2:视频分解成图片
///视频分解成图片
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std;
void main()
{
Mat frame;
char outfile[50];
VideoCapture cap("2.avi"); //创建VideoCapture类读视频
if(!cap.isOpened()) //判断是否成功打开视频
return;
int totalFrame = cap.get(CV_CAP_PROP_FRAME_COUNT); //VideoCapture类的get方法获取视频总帧数
for(int i = 1; i<=totalFrame; i++) //for循环totalFrame次
{
cap>>frame; //读取每一帧
if(frame.empty()) //判断帧异常
break;
sprintf(outfile, "E:\\pic\\%d.bmp", i); //利用sprintf格式化图片名
imwrite(outfile, frame); //保存每一帧到目标地址
imshow("video", frame);
waitKey(15);
}
cap.release();
destroyAllWindows();
}
运行结果:将2.avi的所有帧分解成图片,保存在了本地。
代码3:图片合成视频
///图片合成视频
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std;
void main()
{
//创建VideoWriter类写视频到本地
VideoWriter writer("E:\\out.avi", CV_FOURCC('X', 'V', 'I', 'D'), 20, Size(568, 320), true);
//VideoCapture cap;
char filename[50];
Mat frame;
for(int i = 1; i<644; i++)
{
sprintf(filename, "E:\\pic\\%d.bmp", i);
frame = imread(filename); //读图片的方法(一句就行)
//cap.open(filename); //读视频的方法(以下四句)
//if(!cap.isOpened())
// break;
//cap>>frame;
if(frame.empty()) //检测帧异常
break;
writer<<frame; //写入帧
}
cout<<"write end!"<<endl;
destroyAllWindows();
}
运行结果:将上一个代码中分解出来的图片,重新合成了视频文件out.avi