1. 程式人生 > >0012-用OpenCV批量讀取圖片的三種方法

0012-用OpenCV批量讀取圖片的三種方法

有時我們需要批量讀取圖片,所以我們有必要知道怎麼在OpenCV開源環境下批量讀取圖片!

批量讀取圖片的關鍵是如何讓程式知道資料夾下圖片的名字!

第一種方法
這種方法只針對圖片名字有規律的情況,比如:
***(0).jpg
***(1).jpg
***(2).jpg
***(3).jpg
..................

原始碼如下
程式碼中用到的圖片下載連結為:http://pan.baidu.com/s/1hr7GUtI 密碼:gf7w

//opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>    
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>

using namespace cv;
using namespace std;

#define  NUM  13    //讀取image的個數  
int main()
{
        Mat image;
        string ImgName;
        int n = 1;
        while (n <= NUM)   //13
        {
                //while迴圈中的完整程式碼請搜尋公眾號"qxsf321",關注後回覆0012即可獲取
                //while迴圈中的完整程式碼請搜尋公眾號"qxsf321",關注後回覆0012即可獲取
                //while迴圈中的完整程式碼請搜尋公眾號"qxsf321",關注後回覆0012即可獲取
        }

        waitKey(0);
        system("pause");
        return 0;
}

程式碼說明
上面的程式碼實現的關鍵是把int型別轉化為字串型別,在這裡使用類stringstream來進行轉換,有人要問為什麼不用sprintf來實現,具體的原因和對類stringstream的使用說明大家可下面這個網頁!
http://www.cppblog.com/Sandywin/archive/2007/07/13/27984.html

在上面的程式碼中,我們想在路徑 D:\\Hubble 想讀取13張圖片,但是我只在資料夾中放了10張圖片,所以前10張應該是讀取成功,而後三張是讀取失敗的。
相關截果如下



第二種方法
將影象的名字放在一個txt檔案中,每一行是一幅影象的名字!
原始碼如下
程式碼中用到的圖片下載連結:http://pan.baidu.com/s/1c1DoSa0 密碼:h2n0
程式碼中所需的txt檔案下載連結:http://pan.baidu.com/s/1c2q4zW8 密碼:0zhl

//opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>    
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
#include <fstream>  

using namespace cv;
using namespace std;

int main()
{
        Mat image;
        string ImgName;
        ifstream fin("Hubble_name_list.txt");//開啟原始樣本圖片檔案列表  
        while (getline(fin, ImgName)) //一行一行讀取檔案列表  
        {
                //while迴圈中的完整程式碼請搜尋公眾號"qxsf321",關注後回覆0012即可獲取
                //while迴圈中的完整程式碼請搜尋公眾號"qxsf321",關注後回覆0012即可獲取
                //while迴圈中的完整程式碼請搜尋公眾號"qxsf321",關注後回覆0012即可獲取
        }
        printf("本程式由qxsf321.net提供\n");
        printf("本程式由qxsf321.net提供\n");
        printf("本程式由qxsf321.net提供\n");
        waitKey(0);
        return 0;
}


程式碼說明

上面的程式用類ifstream實現一行一行的讀取txt檔案,具體的使用方法這裡就不再贅述了,看上面的程式碼很容易明白。
相關截圖如下

上圖中之所以最後三幅影象讀取失敗,是因為資料夾下沒有這三個名字的影象,資料夾下有的圖片如下面截圖所示



第三種方法
前兩種方法都需要知道圖片的名字,第三種方法則不需要,這種方法能自動遍歷讀取檔案下的所有圖片檔案!
原始碼如下
程式碼中用到的圖片下載連結:http://pan.baidu.com/s/1qYhsAwW 密碼:3see
程式碼中用到的標頭檔案<dirent.h>下載連結:http://pan.baidu.com/s/1i4WH0HZ 密碼:bwas

//opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>    
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
#include <dirent.h>  

using namespace cv;
using namespace std;

int main()
{
        DIR *dir;
        struct dirent *entry;
        
        //這個程式的完整程式碼請搜尋公眾號"qxsf321",關注後回覆0012即可獲取
        //這個程式的完整程式碼請搜尋公眾號"qxsf321",關注後回覆0012即可獲取
        //這個程式的完整程式碼請搜尋公眾號"qxsf321",關注後回覆0012即可獲取

        return 0;
}

程式碼說明

本程式用dirent.h中定義的DIR類實現對目錄中所有檔案的遍歷讀取!具體的使用方法這裡就不再贅述了,看上面的程式碼很容易明白。
上面的程式碼需要包含標頭檔案<dirent.h>,這個標頭檔案下載連結:連結:http://pan.baidu.com/s/1i4WH0HZ  分享密碼請搜尋公眾號"qxsf321",關注後回覆0012即可獲取
程式執行截圖如下