将图像统一为相同的尺寸!!!
//批量处理:将图像统一为相同的尺寸
#include"stdafx.h"
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
#include <vector>
#include <cstdio>
#include <iostream>
#include <stdio.h>
#ifdef _DEBUG
#pragma comment(lib,"lib/opencv_core249d.lib")
#pragma comment(lib,"lib/opencv_imgproc249d.lib")
#pragma comment(lib,"lib/opencv_highgui249d.lib")
#pragma comment(lib,"lib/opencv_objdetect249d.lib")
#pragma comment(lib,"lib/opencv_ml249d.lib")
#else
#pragma comment(lib,"lib/opencv_core249")
#pragma comment(lib,"lib/opencv_imgproc249")
#pragma comment(lib,"lib/opencv_highgui249")
#pragma comment(lib,"lib/opencv_objdetect249")
#pragma comment(lib,"lib/opencv_ml249")
#endif
using namespace std;
using namespace cv;
#define DST_IMG_WIDTH 24 //需要调整图片后的尺寸宽度
#define SRC_IMG_HEIGH 24 //需要调整图片后的尺寸高度
int main(int argc, char* argv[])
{
Mat src_img;
int i, j;
string src_img_name = "./yale/", dst_img_name = "./yale_small_size/";//源文件和目的文件的文件夹名字
char chari[5], charj[5];//因为人脸数据不是很多,所以下标5足够用(可以容纳10万张图片)
for (i = 1; i <= 2; i++)//2个人的人脸数据
{
for (j = 1; j <= 11; j++)//每个人的人脸有11种不同的表情
{
//10:十进制
_itoa(i, chari, 10);//将变量转换成字符型,此处的chari是字符数组首地址
_itoa(j, charj, 10);
src_img_name += chari;//原图命名格式为,比如第5个人的第6张图,5_s6.bmp
src_img_name += "_s";
src_img_name += charj;
src_img_name += ".bmp";
src_img = imread(src_img_name, 1);
Mat dst_img_rsize(DST_IMG_WIDTH, SRC_IMG_HEIGH, src_img.type());
resize(src_img, dst_img_rsize, dst_img_rsize.size(), 0, 0, INTER_LINEAR);
dst_img_name += chari;//转换后图的命名格式为:例上,5_s6n.bmp
dst_img_name += "_s";
dst_img_name += charj;
dst_img_name += "n.bmp";
imwrite(dst_img_name, dst_img_rsize);
src_img_name = "yale/", dst_img_name = "yale_small_size/";//每次循环后要重新清0字符数组内的内容,目标文件夹一定要事先建立,否则无效果
}
}
return 0;
}
//升级版
//可以使用多重文件夹调用 ./yalefaces/1/s1.bmp(每个人脸放置在不同的文件夹下)
#include"stdafx.h"
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
#include <vector>
#include <cstdio>
#include <iostream>
#include <stdio.h>
#ifdef _DEBUG
#pragma comment(lib,"lib/opencv_core249d.lib")
#pragma comment(lib,"lib/opencv_imgproc249d.lib")
#pragma comment(lib,"lib/opencv_highgui249d.lib")
#pragma comment(lib,"lib/opencv_objdetect249d.lib")
#pragma comment(lib,"lib/opencv_ml249d.lib")
#else
#pragma comment(lib,"lib/opencv_core249")
#pragma comment(lib,"lib/opencv_imgproc249")
#pragma comment(lib,"lib/opencv_highgui249")
#pragma comment(lib,"lib/opencv_objdetect249")
#pragma comment(lib,"lib/opencv_ml249")
#endif
using namespace std;
using namespace cv;
#define DST_IMG_WIDTH 24 //需要调整图片后的尺寸宽度
#define DST_IMG_HEIGH 24 //需要调整图片后的尺寸高度
int main(int argc, char* argv[])
{
Mat src_img;
int i, j;
string src_img_name = "./yalefaces/", dst_img_name = "./yale_small_size/";//源文件和目的文件的文件夹名字
char chari[5], charj[5];//因为人脸数据不是很多,所以下标5足够用(可以容纳10万张图片)
for (i = 1; i <= 15; i++)//15个人的人脸数据
{
for (j = 1; j <= 11; j++)//每个人的人脸有11种不同的表情
{
//10:十进制
_itoa(i, chari, 10);//将变量转换成字符型,此处的chari是字符数组首地址
_itoa(j, charj, 10);
src_img_name += chari;//原图命名格式为,比如第5个人的第6张图,5_s6.bmp
src_img_name += "/";
src_img_name += "s";//这两句可以合并:src_img_name += "/s";
src_img_name += charj;
src_img_name += ".bmp";
src_img = imread(src_img_name, 1);
Mat dst_img_rsize(DST_IMG_WIDTH, DST_IMG_HEIGH, src_img.type());
resize(src_img, dst_img_rsize, dst_img_rsize.size(), 0, 0, INTER_LINEAR);
dst_img_name += chari;//转换后图的命名格式为:例上,5_s6n.bmp
dst_img_name += "_s";
dst_img_name += charj;
dst_img_name += "n.bmp";
imwrite(dst_img_name, dst_img_rsize);
src_img_name = "./yalefaces/", dst_img_name = "yale_small_size/";//每次循环后要重新清0字符数组内的内容,目标文件夹一定要事先建立,否则无效果
}
}
return 0;
}
备注:
C:itoa()
C++:_itoa()
char chari[5]
itoa(i,chari,10);
将变量转换成字符型,此处的chari是字符数组首地址,但是如果定义为char *chari="";则会出现错误,why?
其原因是:itoa需要传一个非空指针(char *),如果没有chari分配内存空间的话就会出错。
参考资料:http://www.cnblogs.com/tornadomeet/archive/2012/03/27/2420088.html