1. 程式人生 > >opencv——批量處理圖片並儲存

opencv——批量處理圖片並儲存

           背景:某資料夾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()函式: