C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Python与C++ 遍历文件夹下的所有图片实现代码大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

 Pyhton与C++ 遍历文件夹下的所有图片实现代码

前言

然本文说的是遍历图片,但是遍历其他文件也是可以的

在进行图像处理的时候,大部分时候只需要处理单张图片。但是一旦把图像处理和机器学习相结合,或者做一些稍大一些的任务的时候,常常需要处理好多图片。而这里面,一个最基本的问题就是如何遍历这些图片

用OpenCV做过人脸识别的人应该知道,那个项目中并没有进行图片的遍历,而是用了一种辅助方案,生成一个包含所有图片路径的文件at.txt,然后通过这个路径来读取所有图片。而且这个辅助文件不仅包含了图片的路径,还包含了图片对应的标签。所以在进行训练的时候直接通过这个辅助文件来读取训练用的图片标签

其实如果去看看教程,会发现这个at.txt的生成是通过Python代码来实现。所以今天就来看一下如何用C++来实现文件夹下所有图片的遍历。

当然在此之前还是先给出Python遍历的代码以备后用。

Python遍历

在之前的数独项目中,进行图像处理的时候用到了遍历文件夹下所有的图片。主要是利用glob模块。glob是python自己带的一个文件操作相关模块,内容不多,可以用它查找符合自己目的的文件

# encoding: UTF-8
import glob as gb
import cv2

#Returns a list of all folders with participant numbers
img_path = gb.glob("numbers\\*.jpg") 
for path in img_path:
  img = cv2.imread(path) 
  cv2.imshow('img',img)
  cv2.waitKey(1000)

C++遍历

1. opencv自带函数glob()遍历

OpenCV自带一个函数glob()可以遍历文件,如果用这个函数的话,遍历文件也是非常简单的。这个函数非常强大,人脸识别的时候用这个函数应该会比用at.txt更加方便一个示例如下。

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

using namespace std;
using namespace cv;

vector<Mat> read_images_in_folder(cv::string pattern);

int main()
{
  cv::string pattern = "G:/temp_picture/*.jpg";
  vector<Mat> images = read_images_in_folder(pattern);

  return 0;  
}

vector<Mat> read_images_in_folder(cv::string pattern)
{
  vector<cv::string> fn;
  glob(pattern,fn,falsE);

  vector<Mat> images;
  size_t count = fn.size(); //number of png files in images folder
  for (size_t i = 0; i < count; i++)
  {
    images.push_BACk(imread(fn[i]));
    imshow("img",imread(fn[i]));
    waitKey(1000);
  }
  return images;
}

需要注意的是,这里的路径和模式都用的是cv::string。

2. 自己写一个遍历文件夹的函数

在windows下,没有dirent.h可用,但是可以根据windows.h自己写一个遍历函数。这就有点像是上面的glob的原理和实现了。

#include<opencv2\opencv.hpp>
#include<iostream>
#include <windows.h> // for windows systems

using namespace std;
using namespace cv;

void read_files(std::vector<String> &filepaths,std::vector<String> &filenames,const String &directory);

int main()
{
  String folder = "G:/temp_picture/";
  vector<String> filepaths,filenames;
  read_files(filepaths,filenames,folder);
  for (size_t i = 0; i < filepaths.size(); ++i)
  {
    //Mat src = imread(filepaths[i]);
    Mat src = imread(folder + filenames[i]);
    if (!src.data)
      cerr << "Problem loading image!!!" << endl;
    imshow(filenames[i],src);
    waitKey(1000);
  }
  return 0;

}

void read_files(std::vector<String> &filepaths,const String &directory)
{
  HANDLE dir;
  WIN32_FIND_DATA file_data;

  if ((dir = FindFirstFile((directory + "/*").c_str(),&file_data)) == INVALID_HANDLE_value)
    return; /* No files found */

  do {
    const String file_name = file_data.cFilename;
    const String file_path = directory + "/" + file_name;
    const bool is_directory = (file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;

    if (file_name[0] == '.')
      conTinue;

    if (is_directory)
      conTinue;

    filepaths.push_BACk(file_path);
    filenames.push_BACk(file_name);
  } while (FindNextFile(dir,&file_data));

  FindClose(dir);
} 

3. 基于Boost

如果电脑上配置了boost库,用boost库来实现这一功能也是比较简洁的。为了用这个我还专门完全编译了Boost。

然而只用到了filesystem

#include <boost/filesystem.hpp>
#include<iostream>
#include<opencv2\opencv.hpp>

using namespace cv;
using namespace std;
using namespace boost::filesystem;

void readFilenamesBoost(vector<String> &filenames,const String &folder);

int main()
{
  String folder = "G:/temp_picture/";
  vector<String> filenames;
  readFilenamesBoost(filenames,folder);
  for (size_t i = 0; i < filenames.size(); ++i)
  {
    Mat src = imread(folder + filenames[i]);

    if (!src.data)
      cerr << "Problem loading image!!!" << endl;
    imshow("img",src);
    waitKey(1000);
  }
  return 0;
}

void readFilenamesBoost(vector<String> &filenames,const String &folder)
{
  path directory(folder);
  directory_iterator itr(directory),end_itr;
  String current_file = itr->path().String();

  for (; itr != end_itr; ++itr)
  {
    if (is_regular_file(itr->path()))
    {
      String filename = itr->path().filename().String(); // returns just filename
      filenames.push_BACk(fileName);
    }
  }
}

各种方法都记录在这里,以便以后用的时候查找。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持

大佬总结

以上是大佬教程为你收集整理的Python与C++ 遍历文件夹下的所有图片实现代码全部内容,希望文章能够帮你解决Python与C++ 遍历文件夹下的所有图片实现代码所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。