【学习OpenCV】opencv:从文件中批量读取图片(百度文库)

绪:在相机标定,图片训练,机器学习,人脸识别中,需要涉及到批量处理图片的问题;

本经验主要介绍3种批量读取图片的方法:

一:通过命名规律直接读取;

二:采用文本文件进行批量读取;

三:由库函数读取图片;

【学习OpenCV】opencv:从文件中批量读取图片(百度文库)_第1张图片、 参考    https://jingyan.baidu.com/article/7f41ecec2b1e1e593d095c02.html

方法/步骤

  1. 1

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

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

    对图像进行读取;

    【学习OpenCV】opencv:从文件中批量读取图片(百度文库)_第2张图片
    【学习OpenCV】opencv:从文件中批量读取图片(百度文库)_第3张图片
    【学习OpenCV】opencv:从文件中批量读取图片(百度文库)_第4张图片















  2. 2

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

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

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

    【学习OpenCV】opencv:从文件中批量读取图片(百度文库)_第5张图片
    【学习OpenCV】opencv:从文件中批量读取图片(百度文库)_第6张图片

    【学习OpenCV】opencv:从文件中批量读取图片(百度文库)_第7张图片









  3. 方法三:

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

    代码如下:

    【学习OpenCV】opencv:从文件中批量读取图片(百度文库)_第8张图片
    【学习OpenCV】opencv:从文件中批量读取图片(百度文库)_第9张图片






  5. 4

    dirent.h:头文件

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

    【学习OpenCV】opencv:从文件中批量读取图片(百度文库)_第10张图片




  6. 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;  

    }  

  7. 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;  

    }  

  8. 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;  

    }  

    END

注意事项

  • 通过stringstream由int型变换为string型
  • txt中,每行为一个图像名
  • 只需要一个“dirent.h”头文件,便可以遍历指定文件夹的所有文件

你可能感兴趣的:(计算机视觉,图像处理,计算机视觉,opencv)