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

C++ OpenCV 读取文件夹下的所有图片并重命名。format(), glob()。

程序员文章站 2022-07-13 08:59:48
...

文中所利用知识点:

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路径下的图片名,并且会遍历子文件。

C++ OpenCV 读取文件夹下的所有图片并重命名。format(), glob()。

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