opencv:从文件中批量读取图片

2025-10-27 15:04:48

1、方法一:以一定规律命名的图像,

通过stringstream由int型变换为string型,

对图像进行读取;

opencv:从文件中批量读取图片

opencv:从文件中批量读取图片

opencv:从文件中批量读取图片

2、方法二:以文本文件的格式批量读取图像:

如以.txt格式,则.txt的内容如下:

【注】:每行为一个图像名;

opencv:从文件中批量读取图片

opencv:从文件中批量读取图片

opencv:从文件中批量读取图片

3、方法三:

只需要一个“dirent.h”头文件,便可以遍历指定文件夹的所有文件;

代码如下:

opencv:从文件中批量读取图片

opencv:从文件中批量读取图片

4、dirent.h:头文件

可以通过百度搜索并下载。

opencv:从文件中批量读取图片

5、dirent.h:中的函数:

/*  

 * Open directory stream using plain old C-string. 

 */  

static DIR* opendir(const char *dirname)   

{  

    struct DIR *dirp;  

    int error;  

  

    /* Must have directory name */  

    if (dirname == NULL  ||  dirname[0] == '\0') {  

        dirent_set_errno (ENOENT);  

        return NULL;  

    }  

  

    /* Allocate memory for DIR structure */  

    dirp = (DIR*) malloc (sizeof (struct DIR));  

    if (dirp) {  

        wchar_t wname[PATH_MAX];  

        size_t n;  

  

        /* Convert directory name to wide-character string */  

        error = dirent_mbstowcs_s (&n, wname, PATH_MAX, dirname, PATH_MAX);  

        if (!error) {  

  

            /* Open directory stream using wide-character name */  

            dirp->wdirp = _wopendir (wname);  

            if (dirp->wdirp) {  

                /* Directory stream opened */  

                error = 0;  

            } else {  

                /* Failed to open directory stream */  

                error = 1;  

            }  

  

        } else {  

            /*  

             * Cannot convert file name to wide-character string.  This 

             * occurs if the string contains invalid multi-byte sequences or 

             * the output buffer is too small to contain the resulting 

             * string. 

             */  

            error = 1;  

        }  

  

    } else {  

        /* Cannot allocate DIR structure */  

        error = 1;  

    }  

  

    /* Clean up in case of error */  

    if (error  &&  dirp) {  

        free (dirp);  

        dirp = NULL;  

    }  

  

    return dirp;  

}  

6、/* 

 * Read next directory entry. 

 * 

 * When working with text consoles, please note that file names returned by 

 * readdir() are represented in the default ANSI code page while any output to 

 * console is typically formatted on another code page.  Thus, non-ASCII 

 * characters in file names will not usually display correctly on console.  The 

 * problem can be fixed in two ways: (1) change the character set of console 

 * to 1252 using chcp utility and use Lucida Console font, or (2) use 

 * _cprintf function when writing to console.  The _cprinf() will re-encode 

 * ANSI strings to the console code page so many non-ASCII characters will 

 * display correcly. 

 */  

static struct dirent* readdir(DIR *dirp)   

{  

    WIN32_FIND_DATAW *datap;  

    struct dirent *entp;  

  

    /* Read next directory entry */  

    datap = dirent_next (dirp->wdirp);  

    if (datap) {  

        size_t n;  

        int error;  

  

        /* Attempt to convert file name to multi-byte string */  

        error = dirent_wcstombs_s(&n, dirp->ent.d_name, PATH_MAX, datap->cFileName, PATH_MAX);  

  

        /*  

         * If the file name cannot be represented by a multi-byte string, 

         * then attempt to use old 8+3 file name.  This allows traditional 

         * Unix-code to access some file names despite of unicode 

         * characters, although file names may seem unfamiliar to the user. 

         * 

         * Be ware that the code below cannot come up with a short file 

         * name unless the file system provides one.  At least 

         * VirtualBox shared folders fail to do this. 

         */  

        if (error  &&  datap->cAlternateFileName[0] != '\0') {  

            error = dirent_wcstombs_s(  

                &n, dirp->ent.d_name, PATH_MAX,   

                datap->cAlternateFileName, PATH_MAX);  

        }  

  

        if (!error) {  

            DWORD attr;  

  

            /* Initialize directory entry for return */  

            entp = &dirp->ent;  

  

            /* Length of file name excluding zero terminator */  

            entp->d_namlen = n - 1;  

  

            /* File attributes */  

            attr = datap->dwFileAttributes;  

            if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) {  

                entp->d_type = DT_CHR;  

            } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {  

                entp->d_type = DT_DIR;  

            } else {  

                entp->d_type = DT_REG;  

            }  

  

            /* Reset dummy fields */  

            entp->d_ino = 0;  

            entp->d_reclen = sizeof (struct dirent);  

  

        } else {  

            /*  

             * Cannot convert file name to multi-byte string so construct 

             * an errornous directory entry and return that.  Note that 

             * we cannot return NULL as that would stop the processing 

             * of directory entries completely. 

             */  

            entp = &dirp->ent;  

            entp->d_name[0] = '?';  

            entp->d_name[1] = '\0';  

            entp->d_namlen = 1;  

            entp->d_type = DT_UNKNOWN;  

            entp->d_ino = 0;  

            entp->d_reclen = 0;  

        }  

  

    } else {  

        /* No more directory entries */  

        entp = NULL;  

    }  

  

    return entp;  

}  

7、/* 

 * Close directory stream. 

 */  

static int closedir(DIR *dirp)   

{  

    int ok;  

    if (dirp) {  

  

        /* Close wide-character directory stream */  

        ok = _wclosedir (dirp->wdirp);  

        dirp->wdirp = NULL;  

  

        /* Release multi-byte character version */  

        free (dirp);  

  

    } else {  

  

        /* Invalid directory stream */  

        dirent_set_errno (EBADF);  

        ok = /*failure*/-1;  

  

    }  

    return ok;  

}  

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢