svm 的提前处理
轉載自原文:https://blog.csdn.net/chaipp0607/article/details/53914954
在應用OpenCV大量測試圖片時,需要對圖片批量的讀入并進行處理。之前處理這個問題時是使用這種方法:把待處理的圖片放到一個文件夾內,全選它們然后重命名1,這樣系統會自動給他們全部重命名為1(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);
}
這種方法很麻煩,需要手動重命名一遍,然后根據文件夾下的圖片個數確定循環中的值。有一種更簡便并且靈活性更高的方法,就是遍歷文件夾內所有圖片的路徑,名稱和總個數。
下面這種實現方式其實和OpenCV本身沒什么關系了,是一種應用C++提供的io.h頭文件中定義的函數實現。
先給出函數的定義:
void listFiles(const char * dir, vector& files);
1
可以看到函數沒有返回值,而是將遍歷到的文件信息存儲到vector中,完整的代碼實現如下:
#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); // 關閉搜索句柄
}
備注:
1.在上面的代碼中可以看到,listFiles函數其實在利用遞歸,這意味著,這個函數不僅僅可以找目錄中的文件,還可以找到目錄下每一層的文件,在大多數情況下并不需要區分是遍歷目錄下還是遍歷目錄中,因為目錄是我們自己創建的,要遍歷的路徑也是自己輸入,所以我們完全可以把這個當做遍歷目錄中文件的函數來用。
2.上述代碼在x64,x86平臺上都測試通過,之所以出現x86平臺運行正常,x64編譯通過,運行出現異常,是因為_findfirst()返回類型為intptr_t而非long型,從“intptr_t”轉換到“long”丟失了數據,所以創建句柄時需要:intptr_t handle;
總結
- 上一篇: 详细的基于opencv svm hog的
- 下一篇: qt opencv cmake配置 单纯