opencv——批量處理圖片並儲存
阿新 • • 發佈:2019-01-29
背景:某資料夾X下有若干張圖片,對每一張圖片進行處理,將處理後的圖片儲存至新的資料夾Y下。
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> #include <fstream> int main() { cv::String path = "E:/Data Sets/ORIGINAL/data_road_fisheye/training/label/"; //待處理圖片資料夾地址 cv::String dest = "E:/Data Sets/ORIGINAL/data_road_fisheye/training/greylabel/"; //處理後圖片的儲存地址 cv::String savedfilename; std::vector<cv::String> filenames;
cv::Mat srcImg, dstImg; cv::glob(path, filenames); //opencv裡面用來讀取指定路徑下檔名的一個很好用的函式 for (int i = 0; i < filenames.size(); i++) { srcImg = cv::imread(filenames[i]); cv::cvtColor(srcImg, dstImg, CV_RGB2GRAY); savedfilename = dest + filenames[i].substr(55); std::cout << savedfilename << std::endl; cv::imwrite(savedfilename, dstImg); } return 0; }
cv::glob()函式極大地簡化了對檔案的讀取。
如果不適用opencv,那麼可以採取下面這個方法,在stackoverflow上找到的solution,還沒試過:
#include <vector> #include <stdio.h> #include <windows.h> #include <iostream> #include <string> using namespace std; //---------------------------------------------------------------------- // Get list of files // Usage: // string ImagesDir=tmp+"C:\\Images\\*.jpg"; // vector<string> files=listFilesInDirectory(ImagesDir); //---------------------------------------------------------------------- vector<string> listFilesInDirectory(string directoryName) { WIN32_FIND_DATA FindFileData; HANDLE hFind = FindFirstFile(directoryName.c_str(), &FindFileData); vector<string> listFileNames; listFileNames.push_back(FindFileData.cFileName); while (FindNextFile(hFind, &FindFileData)) listFileNames.push_back(FindFileData.cFileName); return listFileNames; } ... // somewhere in main string YourImagesDirectory="C:\\Pick\\"; vector<string> files=listFilesInDirectory(YourImagesDirectory+"*.jpg"); for(int i=0;i<files.size();i++) { Mat img=imread(YourImagesDirectory+files[i]); imshow("mainwin" , img); ... } ...
//--------------------------------------補充(2018.06.03)----------------------------------------------------------
cv::cvrColor(srcImg, dstImg, CV_RGB2GRAY)將三通道的彩色圖片轉換成了單通道灰色圖片,但是後來用cv::imread()加載出來後發現圖片格式又成了三通道,只不過三個通道的值都一樣 ,參考了一下官方文件,問題出在cv::imread()函式: