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即可獲取
程式執行截圖如下: