天天看點

Linux下OpenCV批量修改圖檔尺寸和檔案名

資料集的預處理工作量較大,為此,在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

繼續閱讀