C++下批量读取名字无规则的图片文件的示例代码(利用类WIN32_FIND_DATA实现)

Posted 昊虹AI笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++下批量读取名字无规则的图片文件的示例代码(利用类WIN32_FIND_DATA实现)相关的知识,希望对你有一定的参考价值。

在博文 https://www.hhai.cc/thread-101-1-1.html 中要求批量读取的图片名字是有规律的,有时候我们会遇到图片名字无规律的情况,此时该怎么办呢?
此时可以利用C++的类WIN32_FIND_DATA实现。

具体实现的代码没什么好说的,大家直接拿来用就行。

代码如下:

//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术
//OpenCV版本 OpenCV3.0

#include <opencv2/opencv.hpp>
#include <iostream>

#include <stdio.h>
#include <windows.h>

using namespace cv;
using namespace std;


// LPCWSTR转string
std::string WChar2Ansi(LPCWSTR pwszSrc)

	int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);

	if (nLen <= 0) return std::string("");

	char* pszDst = new char[nLen];
	if (NULL == pszDst) return std::string("");

	WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
	pszDst[nLen - 1] = 0;

	std::string strTemp(pszDst);
	delete[] pszDst;

	return strTemp;


// 利用winWIN32_FIND_DATA读取文件下的文件名
void readImgNamefromFile(char* fileName, vector <string> &imgNames)

	// vector清零 参数设置
	imgNames.clear();
	WIN32_FIND_DATA file;
	int i = 0;
	char tempFilePath[MAX_PATH + 1];
	char tempFileName[50];
	// 转换输入文件名
	sprintf_s(tempFilePath, "%s/*", fileName);
	// 多字节转换
	WCHAR   wstr[MAX_PATH] =  0 ;
	MultiByteToWideChar(CP_ACP, 0, tempFilePath, -1, wstr, sizeof(wstr));
	// 查找该文件待操作文件的相关属性读取到WIN32_FIND_DATA
	HANDLE handle = FindFirstFile(wstr, &file);
	if (handle != INVALID_HANDLE_VALUE)
	
		FindNextFile(handle, &file);
		FindNextFile(handle, &file);
		// 循环遍历得到文件夹的所有文件名	
		do
		
			sprintf(tempFileName, "%s", fileName);
			imgNames.push_back(WChar2Ansi(file.cFileName));
			imgNames[i].insert(0, tempFileName);
			i++;
		 while (FindNextFile(handle, &file));
	
	FindClose(handle);

int main()

	// 设置读入图像序列文件夹的路径
	char* fileName = "F:/material/images/2022/2022-10/batch_read/";
	std::vector <string>  imgNames;
	// 获取对应文件夹下所有文件名
	readImgNamefromFile(fileName, imgNames);
	// 遍历对应文件夹下所有文件名
	for (int i = 0; i < imgNames.size(); i++)
	
		cv::Mat img = cv::imread(imgNames[i]);
		if (!img.data)
			return -1;
		/* 可添加图像处理算法code*/
		cv::imshow("im", img);
		cv::waitKey(0);
	
	return 0;

代码的运行效果为:
按一次任意键,程序读取并显示一张文件下batch_read的图片。

以上是关于C++下批量读取名字无规则的图片文件的示例代码(利用类WIN32_FIND_DATA实现)的主要内容,如果未能解决你的问题,请参考以下文章

批量取出文件夹中图片的名字存进文本,并去命名新的文件夹下的图片

matlab怎么批量读取一个文件夹中命名规律的tif文件?

详解C++标准库<sstream>中的类stringstream,并利用它实现OpenCV下的图片批量读取

bat批量修改图片的名字实现(两种方法)

用bat怎样批量提取文件夹及子文件夹下面图片?

批量收集照片并按规则命名