赞
踩
思路:
1、批量读入图片
2、剪裁图片并命名保存
#include <iostream> #include <typeinfo> #include <opencv2/opencv.hpp> #include <windows.h> using namespace std; using namespace cv; void CutImage(Mat img,int H,int W,string num) { //传入图片img,剪裁高度H,剪裁宽度W,第num张图片用于命名 int height, width, ph = 0, pw = 0, count = 0, cut_H; string filename,savepath="D:/Cut_test/"; //定义保存位置及filename每张图片编号 Rect cut_size; //定义在图片中剪裁的区域 height = img.rows; width = img.cols; //获取原图尺寸 H = H > int(height * 0.1) ? H : int(height * 0.1); //剪裁尺寸最小为原图长宽的10% W = W > int(width * 0.1) ? W : int(width * 0.1); cut_H = H; //实际用到的剪裁高度 printf("height:%d width:%d\n", height, width); //输出原图尺寸 while (ph < height) { //当前高度位置ph小于原图高度 bool Tab = 0; //横向剪裁完毕标志位 while (pw < width) { //当前宽度位置pw小于原图宽度 if (pw + W - 1 < width) { //若需剪裁的宽度小于原图宽度 cut_size = Rect(pw, ph, W , cut_H); //按输入尺寸获取剪裁区域, //Rect(x,y,w,h):x为横向起点,y为纵向起点,w为横向宽度,h为纵向宽度 printf("pw:%d ph:%d W-1:%d cut_H:%d\n", pw, ph, W - 1, cut_H); } else { //当需剪裁宽度超过原图宽度 cut_size = Rect(pw, ph, width - pw - 1, cut_H); //宽度沿边剪裁 printf("pw:%d ph:%d width-pw-1:%d cut_H:%d\n", pw, ph, width - pw - 1, cut_H); Tab = 1; //横向剪裁完毕 } count++; //当前原图剪裁数量 filename =num+to_string(count) + ".bmp"; //第num张原图的count个剪裁 Mat cut_image = img(cut_size); //剪裁指定区域 imwrite(savepath+filename, cut_image); //保存图片 if (Tab) break; //判断横向检测是否完毕 else pw += W - 5; //横向坐标右移动并保证5个像素的重叠 } ph += H - 5; //横向剪裁完毕,纵向坐标向下移动 pw = 0; //横向坐标归零 if (ph + H - 1 > height) //判断纵向剪裁大于原图高度 cut_H = height - ph - 1; //实际纵向沿下边界剪裁 } } std::vector<cv::String> Get_name() { std::vector<cv::String> filenames; //定义字符串列表 cv::String path = "D:/TheFirstGenerationMachine/Dataset/Cut_image"; //定义文件夹路径 cv::glob(path, filenames); //将文件夹中所有文件名称及路径保存至filenames列表 return filenames; } int main() { int H, W; //定义裁剪高H,宽W scanf_s("%d%d", &H, &W); //输入需裁剪尺寸 std::vector<cv::String> filenames=Get_name(); //获取文件夹中图片名称及位置 for (size_t i = 0; i < filenames.size(); ++i) { //遍历每张图片 cout << filenames[i] << endl; //输出图片位置 Mat image = imread(filenames[i]); //读入图片 CutImage(image,H,W,to_string(i)+"_"); //图片剪裁 } waitKey(0); return 0; }
Vector< type >生成type类型的列表(类似Python)
waiKey(time) 等待用户time毫秒按键触发继续,若time=0则持续等待
cv::glob(String pattern, std::vector< String >& result, bool recursive = false)
当recursive为true时,遍历子文件夹。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。