将图像统一为相同的尺寸

版权声明:本文为@那年聪聪 原创文章,未经博主允许不得转载。 https://blog.csdn.net/duan19920101/article/details/53672937

将图像统一为相同的尺寸!!!


//批量处理:将图像统一为相同的尺寸 
#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

猜你喜欢

转载自blog.csdn.net/duan19920101/article/details/53672937