svm 的提前处理
轉(zhuǎn)載自原文:https://blog.csdn.net/chaipp0607/article/details/53914954
在應(yīng)用OpenCV大量測試圖片時,需要對圖片批量的讀入并進行處理。之前處理這個問題時是使用這種方法:把待處理的圖片放到一個文件夾內(nèi),全選它們?nèi)缓笾孛?,這樣系統(tǒng)會自動給他們?nèi)恐孛麨?(1),1(2),1(3)等等等
然后用下面的代碼把圖片讀進來:
for ( i=1;i<=624;i++)
{
sprintf_s(adr, “C:\Users\Administrator\Desktop\第二組截圖\1 (%d).jpg”,i);
Mat g_SrcImage;
g_SrcImage=imread(adr);
printf(“i=%d”,i);
}
這種方法很麻煩,需要手動重命名一遍,然后根據(jù)文件夾下的圖片個數(shù)確定循環(huán)中的值。有一種更簡便并且靈活性更高的方法,就是遍歷文件夾內(nèi)所有圖片的路徑,名稱和總個數(shù)。
下面這種實現(xiàn)方式其實和OpenCV本身沒什么關(guān)系了,是一種應(yīng)用C++提供的io.h頭文件中定義的函數(shù)實現(xiàn)。
先給出函數(shù)的定義:
void listFiles(const char * dir, vector& files);
1
可以看到函數(shù)沒有返回值,而是將遍歷到的文件信息存儲到vector中,完整的代碼實現(xiàn)如下:
#include
#include <io.h>
#include
#include
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
void listFiles(const char * dir, vector& files);
int main()
{
string path = “E:\facedata\faceReg”;
vector files;
listFiles(path.c_str(),files);
for (int i = 0; i < files.size();i++)
{
cout << files[i] << endl;
Mat SrcImage = imread(files[i]);
namedWindow(“show”, 0);
imshow(“show”, SrcImage);
waitKey(10);
}
waitKey(0);
return 0;
}
//目錄中的所有圖片(到每一級目錄)
void listFiles(const char * dir, vector& files)
{
char dirNew[200];
strcpy(dirNew, dir);
strcat(dirNew, “\.”); // 在目錄后面加上"\.“進行第一次搜索
intptr_t handle;
_finddata_t findData;
handle = _findfirst(dirNew, &findData);
if (handle == -1) // 檢查是否成功
return;
do
{
if (findData.attrib & _A_SUBDIR)
{
if (strcmp(findData.name, “.”) == 0 || strcmp(findData.name, “…”) == 0)
continue;
cout << findData.name << “\t
// 在目錄后面加上”\“和搜索到的目錄名進行下一次搜索
strcpy(dirNew, dir);
strcat(dirNew, “\”);
strcat(dirNew, findData.name);
listFiles(dirNew, files);
}
else
files.push_back(string(dir).append(”\").append(findData.name));
cout << findData.name << “\t” << findData.size << " bytes.\n";
} while (_findnext(handle, &findData) == 0);
_findclose(handle); // 關(guān)閉搜索句柄
}
備注:
1.在上面的代碼中可以看到,listFiles函數(shù)其實在利用遞歸,這意味著,這個函數(shù)不僅僅可以找目錄中的文件,還可以找到目錄下每一層的文件,在大多數(shù)情況下并不需要區(qū)分是遍歷目錄下還是遍歷目錄中,因為目錄是我們自己創(chuàng)建的,要遍歷的路徑也是自己輸入,所以我們完全可以把這個當(dāng)做遍歷目錄中文件的函數(shù)來用。
2.上述代碼在x64,x86平臺上都測試通過,之所以出現(xiàn)x86平臺運行正常,x64編譯通過,運行出現(xiàn)異常,是因為_findfirst()返回類型為intptr_t而非long型,從“intptr_t”轉(zhuǎn)換到“l(fā)ong”丟失了數(shù)據(jù),所以創(chuàng)建句柄時需要:intptr_t handle;
總結(jié)
- 上一篇: 详细的基于opencv svm hog的
- 下一篇: qt opencv cmake配置 单纯