Opencv——批量处理同一文件夹下的图片(解决savedfilename = dest + filenames[i].substr(len)问题)


前言

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾牙慧者

欢迎请作者喝奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值