将图像统一为相同的尺寸

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


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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要批量将图像转换为统一的大小尺寸,我们可以使用Python的图像处理库PIL(Python Imaging Library)或OpenCV来实现。 使用PIL来实现,首先需要安装PIL库(可以使用pip install pillow命令安装)。然后,可以按照以下步骤进行处理: 1. 导入PIL库的Image模块: ``` from PIL import Image ``` 2. 创建一个空的列表来存储处理后的图像: ``` processed_images = [] ``` 3. 遍历图像文件夹中的每个图像文件: ``` import os image_folder = '/path/to/folder/' for filename in os.listdir(image_folder): if filename.endswith('.jpg') or filename.endswith('.png'): image_path = os.path.join(image_folder, filename) image = Image.open(image_path) # 进行图像尺寸统一处理 processed_image = image.resize((width, height)) processed_images.append(processed_image) ``` 请注意,上述代码中的width和height需要替换为你想要的统一尺寸大小。 4. 遍历处理后的图像列表,并保存处理后的图像文件: ``` output_folder = '/path/to/output/folder/' for i, image in enumerate(processed_images): output_path = os.path.join(output_folder, f'processed_image_{i}.jpg') image.save(output_path) ``` 请确保提供一个输出文件夹的路径,以保存处理后的图像文件。 如果选择使用OpenCV来实现,可以按照以下步骤进行处理: 1. 导入cv2库: ``` import cv2 ``` 2. 创建一个空的列表来存储处理后的图像: ``` processed_images = [] ``` 3. 遍历图像文件夹中的每个图像文件: ``` import os image_folder = '/path/to/folder/' for filename in os.listdir(image_folder): if filename.endswith('.jpg') or filename.endswith('.png'): image_path = os.path.join(image_folder, filename) image = cv2.imread(image_path) # 进行图像尺寸统一处理 processed_image = cv2.resize(image, (width, height)) processed_images.append(processed_image) ``` 请注意,上述代码中的width和height需要替换为你想要的统一尺寸大小。 4. 遍历处理后的图像列表,并保存处理后的图像文件: ``` output_folder = '/path/to/output/folder/' for i, image in enumerate(processed_images): output_path = os.path.join(output_folder, f'processed_image_{i}.jpg') cv2.imwrite(output_path, image) ``` 请确保提供一个输出文件夹的路径,以保存处理后的图像文件。 以上就是使用Python批量将图像转换为统一大小尺寸的简单方法,你可以根据自己的需求进行适当修改和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值