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, std::vector<string> &filenames, 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);
    }
  }
}

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

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

(0)

相关推荐

  • C++遍历文件夹下的所有文件

    数据分多个文件存储,读取数据就需要对多个文件进行操作.首先就需要定位到文件的名字,之后再对文件进行相应的读写操作.多次涉及多文件的读写操作,现将这个实现总结一下,方便自己和他人使用.具体代码如下: #include "stdafx.h" #include <stdio.h> #include<iostream> #include<vector> #include <Windows.h> #include <fstream> #

  • C++遍历文件夹下文件的方法

    本文实例讲述了C++遍历文件夹下文件的方法.分享给大家供大家参考.具体如下: #include <windows.h> #include <stdio.h> #include <string.h> #define LEN 1024 // 深度优先递归遍历目录中所有的文件 BOOL DirectoryList(LPCSTR Path) { WIN32_FIND_DATA FindData; HANDLE hError; int FileCount = 0; char Fi

  • C++遍历文件夹获取文件列表

    本文实例类似遍历一个文件夹然后获得该文件夹下的文件列表,可以随意切换文件目录,本来是用在我们小组写的简易ftp服务器上的一个给客户端显示的一个小插件,总之单拿出来应该没啥含量,调用了windows的一些API. 实例代码: #include<iostream> #include<stdlib.h> #include<windows.h> #include<fstream> #include<stdio.h> #include<vector&

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

     Pyhton与C++ 遍历文件夹下的所有图片实现代码 前言 虽然本文说的是遍历图片,但是遍历其他文件也是可以的. 在进行图像处理的时候,大部分时候只需要处理单张图片.但是一旦把图像处理和机器学习相结合,或者做一些稍大一些的任务的时候,常常需要处理好多图片.而这里面,一个最基本的问题就是如何遍历这些图片. 用OpenCV做过人脸识别的人应该知道,那个项目中并没有进行图片的遍历,而是用了一种辅助方案,生成了一个包含所有图片路径的文件at.txt,然后通过这个路径来读取所有图片.而且这个辅助文件不仅

  • C++遍历文件夹下所有文件的多种方法

    为数不多的好用的代码,遍历文件夹获取所有子文件名,"filespec"可用通配符"*?".注意如果用相对路径的话,获取所有文件名后应再调用SetInitDir将初始目录改为当前目录,否则中间生成的文件都会放在之前的"InitDir"内. C/C++遍历文件夹感觉真是很不好用,建议还是使用C/C++做单任务处理,然后通过脚本语言实现遍历比较合理. CBrowseDir.h #include <io.h> #include <std

  • python或C++读取指定文件夹下的所有图片

    本文实例为大家分享了python或C++读取指定文件夹下的所有图片,供大家参考,具体内容如下 1.python读取指定文件夹下的所有图片路径和图片文件名 import cv2 from os import walk,path def get_fileNames(rootdir): data=[] prefix = [] for root, dirs, files in walk(rootdir, topdown=True): for name in files: pre, ending = pa

  • python使用openCV遍历文件夹里所有视频文件并保存成图片

    如果你在文件夹里有很多视频,并且文件夹里还有文件夹,文件夹里的文件夹也有视频,怎么能逐个读取并且保存..所以我写了个代码用了os,walk,这个可以遍历所有文件夹里的文件和文件夹 import os import cv2 cut_frame = 250 # 多少帧截一次,自己设置就行 save_path = "C:\文献与资料\手持红外\图片" for root, dirs, files in os.walk(r"C:\文献与资料\手持红外"): # 这里就填文件夹

  • asp.net遍历文件夹下所有子文件夹并绑定到gridview上的方法

    遍历文件夹下所有子文件夹,并且遍历配置文件某一节点中所有key,value并且绑定到GridView上 Helper app_Helper = new Helper(); DataSet ds = new DataSet(); DataTable dt = new DataTable(); protected void Page_Load(object sender, EventArgs e) { gvwBind(); } #region 绑定GridView /// <summary> //

  • node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小

    node.js版     遍历文件夹下最大的文件,并输出路径,大小 实现代码: /* 遍历文件夹下最大的文件,并输出路径,大小 */ function findmax(basepath){ //只能执行一次 if(findmax.s) return; findmax.s = true; var fs = require('fs'); var maxfile = 0; var count = 0; var begin = new Date().getTime(); function Travers

  • JAVA实现遍历文件夹下的所有文件(递归调用和非递归调用)

    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = 0, folderNum = 0; File file = new File(path); if (file.exists()) { LinkedList<File> list = new LinkedList<File>(); File[] files = file.listFile

  • C# 遍历文件夹子目录下所有图片及遍历文件夹下的文件

    要求:取指定目录下面的所有图片,以表格的型式展示并显示该图片的相对路径. 服务端代码: public partial class ViewIcon : System.Web.UI.Page { JArray ja = new JArray(); //定义一个数组 public string info = string.Empty; protected void Page_Load(object sender, EventArgs e) { var path1 = System.AppDomain

随机推荐