最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python與C++ 遍歷文件夾下的所有圖片實(shí)現(xiàn)代碼

 更新時(shí)間:2017年06月01日 16:10:23   作者:冰不語  
這篇文章主要介紹了 Python與C++ 遍歷文件夾下的所有圖片實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下

 Pyhton與C++ 遍歷文件夾下的所有圖片實(shí)現(xiàn)代碼

前言

雖然本文說的是遍歷圖片,但是遍歷其他文件也是可以的。

在進(jìn)行圖像處理的時(shí)候,大部分時(shí)候只需要處理單張圖片。但是一旦把圖像處理和機(jī)器學(xué)習(xí)相結(jié)合,或者做一些稍大一些的任務(wù)的時(shí)候,常常需要處理好多圖片。而這里面,一個(gè)最基本的問題就是如何遍歷這些圖片。

用OpenCV做過人臉識(shí)別的人應(yīng)該知道,那個(gè)項(xiàng)目中并沒有進(jìn)行圖片的遍歷,而是用了一種輔助方案,生成了一個(gè)包含所有圖片路徑的文件at.txt,然后通過這個(gè)路徑來讀取所有圖片。而且這個(gè)輔助文件不僅包含了圖片的路徑,還包含了圖片對(duì)應(yīng)的標(biāo)簽。所以在進(jìn)行訓(xùn)練的時(shí)候直接通過這個(gè)輔助文件來讀取訓(xùn)練用的圖片和標(biāo)簽。

其實(shí)如果去看看教程,會(huì)發(fā)現(xiàn)這個(gè)at.txt的生成是通過Python代碼來實(shí)現(xiàn)。所以今天就來看一下如何用C++來實(shí)現(xiàn)文件夾下所有圖片的遍歷。

當(dāng)然在此之前還是先給出Python遍歷的代碼,以備后用。

Python遍歷

在之前的數(shù)獨(dú)項(xiàng)目中,進(jìn)行圖像處理的時(shí)候用到了遍歷文件夾下所有的圖片。主要是利用glob模塊。glob是python自己帶的一個(gè)文件操作相關(guān)模塊,內(nèi)容不多,可以用它查找符合自己目的的文件。

# 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自帶函數(shù)glob()遍歷

OpenCV自帶一個(gè)函數(shù)glob()可以遍歷文件,如果用這個(gè)函數(shù)的話,遍歷文件也是非常簡單的。這個(gè)函數(shù)非常強(qiáng)大,人臉識(shí)別的時(shí)候用這個(gè)函數(shù)應(yīng)該會(huì)比用at.txt更加方便。一個(gè)參考示例如下。

#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. 自己寫一個(gè)遍歷文件夾的函數(shù)

在windows下,沒有dirent.h可用,但是可以根據(jù)windows.h自己寫一個(gè)遍歷函數(shù)。這就有點(diǎn)像是上面的glob的原理和實(shí)現(xiàn)了。

#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庫來實(shí)現(xiàn)這一功能也是比較簡潔的。為了用這個(gè)我還專門完全編譯了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);
    }
  }
}

各種方法都記錄在這里,以便以后用的時(shí)候查找。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論

建湖县| 定远县| 赤峰市| 福州市| 乐都县| 西青区| 台中市| 深泽县| 阿克陶县| 阿克苏市| 肥西县| 龙海市| 泽州县| 咸阳市| 奉节县| 竹北市| 延寿县| 万州区| 岗巴县| 舞阳县| 克什克腾旗| 松江区| 祁门县| 衡山县| 体育| 阳原县| 新沂市| 沂源县| 太保市| 清镇市| 福建省| 同心县| 东明县| 双辽市| 广河县| 台东市| 百色市| 米脂县| 富平县| 绵竹市| 昆山市|