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>
中,作用为用来删除文件夹中的文件
上一篇: 一文搞定babel转换