C++ OpenCV 读取文件夹下的所有图片并重命名。format(), glob()。
文中所利用知识点:
1. cv::String cv::format(const char* fmg,...) 用于给要存储的照片指定路径。
2. void glob(String pattern, std::vector<String>& result, bool recursive = false); 用于遍历指定路径下的文件。
- 代码演示
此代码的目的如下:从一个文件夹中读取后缀为 .jpg的图片,将其存入到另一个指定文件夹,并按顺序命名。
剩余判断,或者输出其他信息,自己可以在代码上进行添加即可。
对于 imread 和 imwrite 函数的理解,可以参考这篇文章。这篇文章
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
string yuanPath = "E:/test/*.jpg";
string mudiPath = "E:/target";
vector<string> result;
glob(yuanPath, result, false); //从文件夹中读取图片路径名
for (int i = 0; i < result.size(); i++) {
string tarpath = mudiPath + format("/img%03d.jpg", i);//设置新的路径
Mat img = imread(result[i], -1);//从路径读取图片,以不变的格式读取
imwrite(tarpath, img);//以新路径存储图片
}
cout << "finish" << endl;
return 0;
}
- 函数讲解
void glob(String pattern, std::vector<String>& result, bool recursive = false);
参数: pattern 是要遍历的路径; result 是要存放的结果,
recursive 这个参数默认为false,此时glob函数只会查找pattern路径下的的匹配类型的文件,不会匹配其他类型及子文件夹。如果为true的话,会遍历子文件。举个例子如下:
string path2 = "E:/test/*.jpg"
vector<String> result;
glob(path2, result, false);
//只能输出path2路径下的图片名,并且不会遍历子文件
vector<String> result2;
glob(path2, result2, true);
//输出path2路径下的图片名,并且会遍历子文件。
result2 为{”E:/test\3.jpg“,”E:/test\311.jpg”,”E:/test\31111.jpg”,”E:/test\3111111.jpg”,”E:/test\311111111.jpg”,”E:/test\31111111111.jpg”,”E:/test\3111111111111.jpg”,”E:/test\target\img000.jpg”,”E:/test\target\img001.jpg”,”E:/test\target\img002.jpg”,”E:/test\target\img003.jpg”,”E:/test\target\img004.jpg”,”E:/test\target\img005.jpg”,”E:/test\target\img006.jpg”}
result 为{”E:/test\3.jpg“,”E:/test\311.jpg”,”E:/test\31111.jpg”,”E:/test\3111111.jpg”,”E:/test\311111111.jpg”,”E:/test\31111111111.jpg”,”E:/test\3111111111111.jpg”}
cv::String cv::format(const char* fmg,...)
format 函数类似于 sprintf 函数。都是用来处理字符串的格式化。
但注意,%s 并不能处理 string类型,因为读入的地址 可能是对象的地址,并不是字符串的首地址,在vs调试是这个原因。 因此在处理字符串格式的时候,只能处理 c 拥有的格式。( string str = "hanhan"; printf("%s",str);这样是不对的。可以这样输出:printf("%s\n",str.c_str());)
int sprintf(char* str, const char* format,...);
成功后,将返回写入的字符总数。此计数不包括自动附加在字符串末尾的其他空字符。
失败时,将返回负数。
#include <cstdio>
int main ()
{
char buffer [50];
int n, a=5, b=3;
n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
printf ("[%s] is a string %d chars long\n",buffer,n);
return 0;
}
//[5 plus 3 is 8] is a string 13 chars long
上一篇: TiDB开启慢查询日志记录
下一篇: javascript 报表框架总结