linux c 读取并处理文件夹下的所有文件

来源:互联网 发布:淘宝你已参加图片保护 编辑:程序博客网 时间:2024/05/16 14:02

定义传递参数使用的结构体:头文件<param.h>

#ifndef _PARAM_H_#define _PARAM_H_typedef struct str_1_param{    char *str;    void *param;} STR_1_PARAM, *pSTR_1_PARAM;#endif

遍历并处理每个文件(指针函数作为参数传递进来现,具体负责处理文件): <procdir.h>

#include <dirent.h>#include <stdio.h>#include <string.h>#include "param.h"//#include <unistd.h>int procdir(char *base, void (*p)(void*), void *param, int isRecursive){    struct dirent *entry = NULL, **namelist;    char path[1000];    int num;    num = scandir(base, &namelist, NULL, alphasort);    if (num<0)    {            printf("Open dir %s failed!\n", base);        return -1;    }    else    {        int i;        for(i=0;i<num;i++)        {            entry = namelist[i];             if(strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") ==0)            {                continue;            }            else if(entry->d_type == 8) //file            {                //process the file                memset(path, '\0', sizeof(path));                sprintf(path, "%s/%s", base, entry->d_name);                ((STR_1_PARAM*)param)->str = path;                (*p)(param);            }             else if(isRecursive && entry->d_type == 4) //directory            {                //process dir                memset(path, '\0', sizeof(path));                sprintf(path, "%s/%s", base, entry->d_name);                procdir(path, p, param, isRecursive);            }        }    }    return 1;}

使用方法:遍历文件夹下图片,提起hog特征:

#include <stdio.h>#include <getopt.h>#include "param.h"#include "procdir.h"#include "cv.h"#include "opencv2/opencv.hpp"using namespace cv; typedef struct MY_PARAM{    IplImage *img;    IplImage *dst;    HOGDescriptor *hog;    FILE *pout;    vector<float> descriptors;} MY_PARAM, *pMY_PARAM;void extr_hog(void *s1p){    STR_1_PARAM *str1param = (STR_1_PARAM*)s1p;    MY_PARAM *my_param = (MY_PARAM*)str1param->param;    my_param->img = cvLoadImage(str1param->str,0);    cvSmooth(my_param->img, my_param->dst, CV_GAUSSIAN, 3, 3);    my_param->hog->compute(my_param->dst, my_param->descriptors, Size(1,1), Size(0,0));    for(int i=0;i<my_param->descriptors.size();i++)    {        fprintf(my_param->pout, "%f ", my_param->descriptors[i]);    }    fprintf(my_param->pout, "\n");    cvReleaseImage(&my_param->img);}int main(int argc, char **argv){    if(argc != 5 )    {        printf("Usage:\n%s [-d InputBaseDir] [-o OutputFile]\n", argv[0]);        return -1;    }    char tmp, *base, *output;    while((tmp=getopt(argc,argv,"d:o:"))!=-1)    {        switch(tmp)        {            case 'd':                base = optarg;                break;            case 'o':                output = optarg;                break;        }    }    FILE *pOutFile;    pOutFile =  fopen(output,"w");    if(!pOutFile)    {        printf("Open/create file %s failed!\n", output);        return -1;    }    MY_PARAM my_param;    my_param.dst = cvCreateImage(cvSize(64,64),8,1);    my_param.pout = pOutFile;    my_param.hog = new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);    STR_1_PARAM str1param;    str1param.param = &my_param;        int rval = procdir(base, extr_hog, &str1param, 1);    fclose(pOutFile);    return 0;}


0 0