資料集的預處理工作量較大,為此,在Linux下借助OpenCV寫了一個比較簡單好用的圖檔批量修改尺寸和檔案名的程式。
1、檔案名的批量修改主要參考《UNIX環境進階程式設計》(第3版) 中ls指令的實作原理,用到opendir()、readdir()、closedir()、rename()函數和dirent結構體無需知道批量檔案原檔案名的前提下,實作檔案的批量重命名。特别的,過濾到了 .和.. 檔案夾。
2、圖像尺寸的批量的修改是在檔案名已知的前提下,利用OpenCV中的imread()、resize()、imwrite()函數實作。
注意事項: 函數定義:int rename(const char * oldpath,const char * newpath);因rename()會将參數oldpath 所指定的檔案名稱改為參數newpath所指的檔案名稱。若newpath所指定的檔案已存在,則會被删除。是以為防止多次調用程式導緻資料集部分内容丢失,oldpath和newpath不要為同一個檔案夾(同一個檔案夾,執行兩遍程式,資料集被删除近一半)。注意:程式執行後,oldpath檔案夾将為空。
#include<dirent.h>
#include<opencv2/opencv.hpp>
#include<string>
#include<errno.h>
#include <unistd.h>
using namespace std;
using namespace cv;
int main()
{
int i = 1;
DIR *dp;
char oldname[100];
char newname[100];
struct dirent *dirp;
const char* oldpath = "./data5/";
const char* newpath = "./data4/";
if((dp = opendir(oldpath)) == NULL)
printf("can't open file");
while((dirp = readdir(dp)) != NULL)
{
if(strcmp(dirp->d_name,".") && strcmp(dirp->d_name,".."))
{
//1、批量修改檔案名
sprintf(newname, "%sn%d.jpg",newpath,i++);
sprintf(oldname, "%s%s",oldpath,dirp->d_name);
int temp = rename(oldname,newname); //将前者修改為後者
if(temp == -1) //如果修改檔案出錯
{
printf("修改檔案名失敗errno is: %d\n",errno); //列印出錯原因
}
else
{
printf("檔案名稱修改成功\n");
//2、批量修改檔案尺寸
Mat inputImg = imread(newname, 0);
Mat resizea;
resizea.create(32, 32, CV_8UC1);
resize(inputImg, resizea, resizea.size(), 0, 0, INTER_CUBIC);
imwrite(newname, resizea);
}
}
}
closedir(dp);
return 0;
}
Linux下編譯指令:
歡迎學習交流,轉載請注明出處https://blog.csdn.net/hzqgangtiexia/article/details/80385086