OpenCV C++批处理图像变为灰度

其实可以使用任意算法或API改变图片,我们这里就直接调cv::cvtColor

源代码如下:

#include<iostream>
#include<opencv2/opencv.hpp>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/core/utils/logger.hpp>
#include<vector>
#include<string>
#include<filesystem>

void show(const char* str, const cv::Mat& src) {
	cv::namedWindow(str, 1);
	cv::imshow(str, src);
}

int main() {
	cv::utils::logging::setLogLevel(cv::utils::logging::LOG_LEVEL_ERROR);
	std::vector<std::string>imagePath;
	std::vector<std::string>imageName;
	std::vector<cv::Mat>Mats;
	cv::Mat src, dst;
	std::filesystem::path p = "D:/自用/vs的c++/OpenCVTest1/新素材/";
	for (const auto& e : std::filesystem::directory_iterator{ p }) {
		imagePath.emplace_back(std::filesystem::path{e}.string());
	}
	//将目录字符串切割只剩下图片名称
	for (const auto& i : imagePath) {
		imageName.push_back(i.substr(41));
	}
	for (auto i : imagePath) {
		src = cv::imread(i);
		cv::cvtColor(src, dst, CV_BGR2GRAY);
        show("test", dst);
		cv::waitKey(1);
		Mats.push_back(dst);
	}
	
	std::filesystem::create_directory("灰度图像");
	for (int i = 0; i < Mats.size(); i++) {
		cv::imwrite("灰度图像/" + imageName[i], Mats[i]);
	}
}

其实代码非常的简单,可自行修改,唯一的问题或许只是这里用到的filesystem是什么呢?它是C++17添加到标准库的文件系统库。

文件系统库 - cppreference.com

还有,我们为什么要在给Mats插入Mat的循环里面调用show显示显示?其实我也不清楚,但是如不让它显示一遍,那么最终的灰度图片中会有大量的重复,个人觉得让它显示一遍只是确保它正确加载了

至于第一行代码你可以不写,它是用于设置只打印error级别的日志信息.

我测试的是处理大概两百多张图片,速度感觉倒是比PS批处理要快一些

处理完毕的:

 

 然鹅就算我哪样写,看着非常简单,程序依旧会抛出异常,但不影响它的结果。有兴趣可以交流讨论讨论。

最后强调一下两个点:1.C++17的std::filesystem::directory_iterator{ p }并非string而是wstring,记得转换,2.要让图片先显示一下确保它真的处理完毕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值