前言
第一份代码实现了批量修改同一文件夹下图片的尺寸,有其他需求时仅需修改处理部分的代码以及文件夹路径。
第二份代码实现了批量截取同一文件夹下每张图片的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后:
截取后的图: