欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++中利用opencv读取文件夹下的所有图片并重命名

程序员文章站 2022-07-13 09:00:12
...

最近编写了一个小程序,把下载的数据集图片全部重命名为0000至9999,因此写了下面这个程序给大家参考一下

/*
 * @Author:初一
 * @date:2020.4.23
 * @brief main.cpp
 * @禁止转载,如需转载,需取得本人同意!
 */
#include <iostream>
#include <vector>
#include <io.h>
#include <string>
#include <cstdio>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
    string path = "/media/chuyi/text/git-restorge/xingqiu/homework/homework1/rgb";//此处替换为自己的图片序列
    string write_path = "/media/chuyi/text/git-restorge/xingqiu/homework/homework1/rgb";
    vector<String> src_name;
    glob(path,src_name, false);//调用opncv中的glob函数,将遍历路径path,将该路径下的全部文件名的绝对路径存进src_name,如/home/chuyi/xingqiu/homework/homework1/rgb/001.png
    if (src_name.size() == 0)
    {
        cerr << "That's no file in " << path <<endl;
        exit(1);
    }
    for (int i = 0; i < src_name.size(); ++i) {
        Mat image = imread(src_name[i]);
        if (image.empty())
        {
            cerr << "Read image " << src_name[i] << " failed!";
            exit(1);
        }
        //imshow("test", image);
        //waitKey(0);
        string new_name = write_path + format("/%04d",i) + ".png";//控制输出为4位整数并在前面补0
        //cout << new_name <<endl;
        imwrite(new_name, image);
        if (remove(src_name[i].c_str()))//删除源图片
        {
            cerr << "Delete " << src_name[i] << " failed" << endl;
        }
        cout << "Renaming " << src_name[i] << " to " << new_name <<endl;
    }
    cout << "Totally rename " << src_name.size() << " pictures!" <<endl;
    return 0;
}

附上CMakeLists.txt

#@Author:初一
#@date:2020.4.23
#@brief CMakeLists.txt
#@禁止转载,如需转载,需取得本人同意!
cmake_minimum_required(VERSION 3.15)
project(rename)
find_package(OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS})
set(CMAKE_CXX_STANDARD 14)

add_executable(rename main.cpp)
target_link_libraries(rename ${OpenCV_LIBS})

我们来认真研读一下main.cpp里面最重要的的函数glob
下面是该函数在OpenCV中的函数原型:

void glob(String pattern, std::vector<String>& result, bool recursive = false);

前两个参数不再作过多叙述,我们来看后一个参数recursive,这个参数默认为false,此时glob函数只会查找pattern路径下的的匹配类型的文件,不会匹配其他类型及子文件夹,举个例子如下:

string pattern1 = "rgb/*.png";
string pattern2 = "rgb"
vector<string> filename;
cv::glob(pattern1,filenamem,flase);

上述程序这时候只会遍历rgb/文件夹下为.png格式的文件,也不会遍历其下的子文件夹,要是传入的参数为pattern2,则会遍历所有文件
如果参数recursive为true的话,则会遍历子文件夹中的图片

然后来讲remove函数,该函数在头文件<cstdio>中,作用为用来删除文件夹中的文件