opencv——批量处理图片并保存

本文介绍了一种使用OpenCV批量处理文件夹内的图片,并将其转换为灰度图像的方法。通过cv::glob函数获取文件夹内所有图片路径,然后逐一对图片进行RGB到灰度的转换,并将处理后的图片保存到指定文件夹。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

           背景:某文件夹X下有若干张图片,对每一张图片进行处理,将处理后的图片保存至新的文件夹Y下。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <fstream>

int main() {
	cv::String path = "E:/Data Sets/ORIGINAL/data_road_fisheye/training/label/";        //待处理图片文件夹地址
	cv::String dest = "E:/Data Sets/ORIGINAL/data_road_fisheye/training/greylabel/";    //处理后图片的保存地址
	cv::String savedfilename;
	std::vector<cv::String> filenames;
	cv::Mat srcImg, dstImg;

	cv::glob(path, filenames);                 //opencv里面用来读取指定路径下文件名的一个很好用的函数
	for (int i = 0; i < filenames.size(); i++) {
		srcImg = cv::imread(filenames[i]);
		cv::cvtColor(srcImg, dstImg, CV_RGB2GRAY);
		savedfilename = dest + filenames[i].substr(55);    
		std::cout << savedfilename << std::endl;
		cv::imwrite(savedfilename, dstImg);
	}
	return 0;
}

        cv::glob()函数极大地简化了对文件的读取。

        如果不适用opencv,那么可以采取下面这个方法,在stackoverflow上找到的solution,还没试过:

#include <vector>
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
        //----------------------------------------------------------------------
        // Get list of files 
        // Usage:
        //  string ImagesDir=tmp+"C:\\Images\\*.jpg";
        //  vector<string> files=listFilesInDirectory(ImagesDir); 
        //----------------------------------------------------------------------
        vector<string> listFilesInDirectory(string directoryName)
        {
            WIN32_FIND_DATA FindFileData;
            HANDLE hFind = FindFirstFile(directoryName.c_str(), &FindFileData);
            vector<string> listFileNames;
            listFileNames.push_back(FindFileData.cFileName);
            while (FindNextFile(hFind, &FindFileData))
                listFileNames.push_back(FindFileData.cFileName);
            return listFileNames;
        }
...
// somewhere in main
string YourImagesDirectory="C:\\Pick\\";
vector<string> files=listFilesInDirectory(YourImagesDirectory+"*.jpg"); 
for(int i=0;i<files.size();i++)
    {
         Mat img=imread(YourImagesDirectory+files[i]);
         imshow("mainwin" , img);
         ...
    }
...

//--------------------------------------补充(2018.06.03)----------------------------------------------------------

cv::cvrColor(srcImg, dstImg, CV_RGB2GRAY)将三通道的彩色图片转换成了单通道灰色图片,但是后来用cv::imread()加载出来后发现图片格式又成了三通道,只不过三个通道的值都一样 ,参考了一下官方文档,问题出在cv::imread()函数:


### 如何使用 OpenCvSharp 实现图像的批量保存OpenCvSharp 中,`Cv2.ImWrite()` 方法用于保存单张图像到文件。要实现图像的批量保存,可以通过循环遍历每一张图像调用 `Cv2.ImWrite()` 来完成此操作[^1]。 以下是具体的代码示例: ```csharp using System; using System.Collections.Generic; using OpenCvSharp; class Program { static void Main(string[] args) { // 假设有一个包含 Mat 对象的列表 List<Mat> images = new List<Mat>(); // 添加一些测试图像数据 images.Add(new Mat("image1.jpg", ImreadModes.Color)); images.Add(new Mat("image2.jpg", ImreadModes.Color)); images.Add(new Mat("image3.jpg", ImreadModes.Color)); // 遍历每一幅图像保存 for (int i = 0; i < images.Count; i++) { string fileName = $"output_image_{i}.jpg"; // 定义输出文件名 Cv2.ImWrite(fileName, images[i]); // 调用 ImWrite 进行保存 Console.WriteLine($"Image saved as {fileName}"); } } } ``` #### 关键点解析 - **`List<Mat>` 数据结构**:通过创建一个存储多个 `Mat` 对象的集合来表示待处理的图像集。 - **`for` 循环**:逐一访问集合中的每一个图像对象,为其指定唯一的文件名称以便区分不同图像。 - **`ImWrite` 函数**:该函数接受两个参数——目标路径以及对应的图像矩阵(即 `Mat` 类型)。它会自动根据扩展名决定编码方式。 如果需要进一步优化性能或者自定义保存选项,则可通过传递额外参数给 `ImWrite` 的第三个可选参数来进行配置。例如调整 JPEG 或 PNG 文件的质量设置等[^2]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值