当前位置:   article > 正文

OpenCV-C++入门学习记录001——图片批量剪裁与保存_opencv对图片的裁剪并保存

opencv对图片的裁剪并保存

批量读入图片并按尺寸剪裁

思路:
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

Vector< type >生成type类型的列表(类似Python)

waiKey(time) 等待用户time毫秒按键触发继续,若time=0则持续等待

cv::glob(String pattern, std::vector< String >& result, bool recursive = false)
当recursive为true时,遍历子文件夹。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/77488?site
推荐阅读
相关标签
  

闽ICP备14008679号