假设我们现在有目标文件夹A,A中包含40个文件夹s1,s2...s40,每个文件夹下包含10张图1,2,3...10。图片大小任意。
我们的目标是在不改变整个图片数据格式的前提下,批量更改图片大小,最后得到的结果是,输出B文件夹,B中包含40个文件夹s1,s2...s40,每个文件夹下包含10张图1,2,3...10,图片大小为我们所需要的大小(这里我使用256X256)。
具体实现借助opencv中的resize函数,具体用法自行百度,参数调用CV_INTER_LINEAR(双线性插值),放缩效果还不错。
贴代码=。=
// Resize_32x32.cpp : 定义控制台应用程序的入口点。
//**********************************************
* 批量更改图片大小
* Win8.1+VS2015+Opencv 2.4.8
* King_HAW
* 2016/12/10
***********************************************/
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <string>
#include <direct.h>
using namespace cv;
using namespace std;
int main()
{
int j = 1;
int k;
int i;
for (k = 1; k <= 40; k++)
{
for (i = 1; i <= 10; i++)
{
char imageName[100];
char imageSave[100];
char FileName[100];
sprintf_s(imageName, "E:\\深度学习\\face_data\\orl_faces_png\\s%d\\%d.png", k, i);
sprintf_s(imageSave, "E:\\ORL_FACE\\s%d\\%d.png", k, j);
sprintf_s(FileName, "E:\\ORL_FACE\\s%d", k);
_mkdir(FileName);
Mat src_img = imread(imageName);//读入图片数据
Mat dst_img1;
resize(src_img, dst_img1, Size(256, 256), 0, 0, CV_INTER_LINEAR); // 双线性插值
imwrite(imageSave, dst_img1);
waitKey(0);
++j;
}
j = 1;
}
}
路径为字符数组,不要直接用字符串。
如果你的图片数据大于两层的话请按照数据层数套for循环。
有时间也可以试试CV_INTER_CUBIC(立方插值),应该会有所差别,选择你认为较好的那个。