Python と C++ を使用してフォルダー内のすべての画像を走査する方法の実装コードを共有する方法
这篇文章主要介绍了 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); } } }
各种方法都记录在这里,以便以后用的时候查找。
以上がPython と C++ を使用してフォルダー内のすべての画像を走査する方法の実装コードを共有する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

H5ページは、コードの脆弱性、ブラウザー互換性、パフォーマンスの最適化、セキュリティの更新、ユーザーエクスペリエンスの改善などの要因のため、継続的に維持する必要があります。効果的なメンテナンス方法には、完全なテストシステムの確立、バージョン制御ツールの使用、定期的にページのパフォーマンスの監視、ユーザーフィードバックの収集、メンテナンス計画の策定が含まれます。

CのRelease_Semaphore関数は、取得したセマフォをリリースするために使用され、他のスレッドまたはプロセスが共有リソースにアクセスできるようにします。セマフォのカウントを1増加し、ブロッキングスレッドが実行を継続できるようにします。

クロール中に58.com作業ページの動的データを取得するにはどうすればよいですか? Crawlerツールを使用して58.comの作業ページをrawったら、これに遭遇する可能性があります...

PSの「読み込み」の問題は、リソースアクセスまたは処理の問題によって引き起こされます。ハードディスクの読み取り速度は遅いか悪いです。CrystaldiskInfoを使用して、ハードディスクの健康を確認し、問題のあるハードディスクを置き換えます。不十分なメモリ:高解像度の画像と複雑な層処理に対するPSのニーズを満たすためのメモリをアップグレードします。グラフィックカードドライバーは時代遅れまたは破損しています:ドライバーを更新して、PSとグラフィックスカードの間の通信を最適化します。ファイルパスが長すぎるか、ファイル名に特殊文字があります。短いパスを使用して特殊文字を避けます。 PS独自の問題:PSインストーラーを再インストールまたは修理します。

コードのコピーと貼り付けは不可能ではありませんが、注意して扱う必要があります。コード内の環境、ライブラリ、バージョンなどの依存関係は、現在のプロジェクトと一致しないため、エラーや予測不可能な結果が得られます。ファイルパス、従属ライブラリ、Pythonバージョンなど、コンテキストが一貫していることを確認してください。さらに、特定のライブラリのコードをコピーして貼り付けるときは、ライブラリとその依存関係をインストールする必要がある場合があります。一般的なエラーには、パスエラー、バージョンの競合、一貫性のないコードスタイルが含まれます。パフォーマンスの最適化は、コードの元の目的と制約に従って再設計またはリファクタリングする必要があります。コピーされたコードを理解してデバッグすることが重要であり、盲目的にコピーして貼り付けないでください。

JavaScriptコードの詳細な説明JavaScriptコードを書くとき、私たちはしばしば長すぎるコードの行に遭遇します。

1.0.1序文このプロジェクト(コードとコメントを含む)は、私の独学の錆の間に記録されました。不正確または不明確な声明があるかもしれませんが、謝罪してください。あなたがそれから利益を得るなら、それはさらに良いです。 1.0.2なぜRustrustは信頼性が高く効率的ですか? Rustは、CとCを同様のパフォーマンスであり、セキュリティが高くなり、CやCのようなエラーを確認するために頻繁な再コンパイルを必要としません。主な利点には、メモリセキュリティ(nullポインターの防止、ぶら下がりポインター、およびデータ競合の防止)が含まれます。スレッドセーフ(実行前にマルチスレッドコードが安全であることを確認してください)。未定義の動作を避けてください(例:境界のない配列、未知の変数、または解放されたメモリへのアクセス)。 Rustは、ジェネリックなどの最新の言語機能を提供します
