文章目录
- 前言
- 一、完整代码
- 二、实现效果
前言
第一份代码实现了批量修改同一文件夹下图片的尺寸,有其他需求时仅需修改处理部分的代码以及文件夹路径。
第二份代码实现了批量截取同一文件夹下每张图片的ROI区域作为结果保存,注意截取后按下enter键才会跳到下一张图片,同时若是对已经截取的不满意只要不按下enter键都是可以重新选择的,这都得益于selectROI函数。
参考了文章:
opencv——批量处理图片并保存
但是编译时发现了问题,debug发现是下面一行代码出了问题。
savedfilename = dest + filenames[i].substr(55);
报错:
[[noreturn]] static void _Xlen()
经过百度,发现代码中的55意味着path的字符串长度。修改代码为
int len = path.length();
savedfilename = dest + filenames[i].substr(len);
问题解决。
一、完整代码
代码1:
#include <opencv2/opencv.hpp>
#include "opencv2/features2d.hpp"
#include <vector>
#include <algorithm>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <fstream>
#define WINDOW_NAME "【程序窗口】"
using namespace cv;
using namespace std;
int main()
{cv::String path = "D:/opencv_picture_test/视觉项目新/"; //待处理图片文件夹地址cv::String dest = "D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/"; //处理后图片的保存地址cout << "获取地址成功"<< endl;cv::String savedfilename;std::vector<cv::String> filenames;int len = path.length();cv::Mat srcImg, dstImg;cv::glob(path, filenames); //opencv里面用来读取指定路径下文件名的一个很好用的函数for (int i = 0; i < filenames.size(); i++) {srcImg = cv::imread(filenames[i]);//*************************对图片的处理部分***************************///这里我们批量修改图片的大小resize(srcImg, dstImg,Size(600,450));//********************************************************************/savedfilename = dest + filenames[i].substr(len);std::cout << savedfilename << std::endl;cv::imwrite(savedfilename, dstImg);cout << "第" << i << "张完成" << endl;}waitKey(0);return 0;
}
代码2:
#include <opencv2/opencv.hpp>
#include "opencv2/features2d.hpp"
#include <vector>
#include <algorithm>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <fstream>
#define WINDOW_NAME "【程序窗口】"
using namespace cv;
using namespace std;
int main()
{//改变控制台字体颜色system("color 02");cv::String path = "D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/"; //待处理图片文件夹地址cv::String dest = "D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/"; //处理后图片的保存地址cout << "获取地址成功" << endl;cv::String savedfilename;std::vector<cv::String> filenames;int len = path.length();cv::Mat srcImg, dstImg;cv::glob(path, filenames); //opencv里面用来读取指定路径下文件名的一个很好用的函数for (int i = 0; i < filenames.size(); i++) {srcImg = cv::imread(filenames[i]);//*************************对图片的处理部分***************************///这里我们批量选择原图中的某块ROI区域作为结果保存Rect2d r;r = selectROI(srcImg, true); //选择一个矩形roi区域dstImg = srcImg(r); //此区域为模板区域destroyAllWindows();//********************************************************************/savedfilename = dest + filenames[i].substr(len);std::cout << savedfilename << std::endl;cv::imwrite(savedfilename, dstImg);cout << "第" << i << "张完成" << endl;waitKey(30);}return 0;
}
有些多余的头文件可以不添加。
二、实现效果
resize后:
截取后的图: