一 批量处理图片
一. 有序图片的读取
对有序的解释
原先图片的名字格式为
1(1).bmp 1(2).bmp 1(3).bmp 1(4).bmp…
或者 1.bmp 2.bmp 3.bmp 4.bmp….
1.实现的功能
根据图片名的规律对文件名进行格式化,统一读入处理
2.代码
#include "mainwindow.h"
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
char filename[50];
char winName[50];
Mat srcImg;
for(int i=1;i<3;i++){
sprintf(filename,"D:\\PICTURE\\1 (%d).bmp",i);
cout<<filename<<endl;
sprintf(winName,"window--%d",i);
srcImg=imread(filename);
if(srcImg.empty())
break;
// 在此处进行图片的处理
imshow(winName,srcImg);
}
waitKey(0);
destroyAllWindows();
}
3.代码解释
sprintf(winName,"window--%d",i);
sprintf(filename,"D:\\PICTURE\\1 (%d).bmp",i);
sprintf函数为filename或者winName进行赋值。
2. 无序文件的读取
通过windows函数进行处理
二 将视频分解为图片
char filename[50];
VideoCapture cap("D:\\1.avi");
if(!cap.isOpened())
{
cout<<"open file filed"<<endl;
return;
}
//获取总帧数
int FrameAccout=cap.get(CAP_PROP_FRAME_COUNT);
Mat frame;
for(int i=1;i<=FrameAccout;i++){
cap.read(frame);
if(frame.empty())
{
cout<<"The frame is empty!"<<endl;
return;
}
imshow("Video",frame);
sprintf(filename,"D:\\1\\%d.png",i);
imwrite(filename,frame);
waitKey(15);
}
cap.release();
destroyAllWindows();
三 将图片合成为视频
/*将图片合成为一个视频*/
VideoWriter writer("D:\\3.avi",-1,20,Size(320,240),true);
Mat frame;
char filename[50];
for(int i=1;i<=119;i++){
sprintf(filename,"D:\\1\\%d.png",i);
frame=imread(filename);
if(frame.empty())
{
cout<<"data is empty"<<endl;
return;
}
imshow("pic",frame);
//frame.resize(300,100);
writer<<frame;
}
通常需要使用resize函数来将图片的大小进行统一化处理
resize
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
各个参数的意义比较直观,但是需要注意的是dsize与fx和fy必须不能同时为零,也就是说要么dsize不为零而fx与fy同时可以为0,要么dsize为0而fx与fy不同时为0;resize函数的目标大小可以是任意的大小,可以不保持长宽比率,删除的像素或者新增的像素值通过interpolation控制;