其实可以使用任意算法或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添加到标准库的文件系统库。
还有,我们为什么要在给Mats插入Mat的循环里面调用show显示显示?其实我也不清楚,但是如不让它显示一遍,那么最终的灰度图片中会有大量的重复,个人觉得让它显示一遍只是确保它正确加载了
至于第一行代码你可以不写,它是用于设置只打印error级别的日志信息.
我测试的是处理大概两百多张图片,速度感觉倒是比PS批处理要快一些
处理完毕的:
然鹅就算我哪样写,看着非常简单,程序依旧会抛出异常,但不影响它的结果。有兴趣可以交流讨论讨论。
最后强调一下两个点:1.C++17的std::filesystem::directory_iterator{ p }并非string而是wstring,记得转换,2.要让图片先显示一下确保它真的处理完毕