c++如何读取和存储多张图片

1. opencv自带函数glob()遍历

OpenCV自带一个函数glob()可以遍历文件,如果用这个函数的话,遍历文件也是非常简单的。这个函数非常强大,人脸识别的时候用这个函数应该会比用at.txt更加方便。

主要函数
void cv::glob(String pattern,std::vector&result,bool recursive=false)

分析
String pattern:绝对路径下的照片

pattern = "/home/Data/data/*.jpg": 选择*.jpg这一类的图片

std::vector< cv::String > & result:这里必须为CV的String,即路径被存在string类型的vector中

bool recursive:可省去,当recursive为false时,仅仅遍历指定文件夹内符合模式的文件;当recursive为true时,会同时遍历指定文件夹的子文件夹

程序
face_tb.cpp

#include "pch.h"
#include "Ve.h"

//#include 
//#include 
//#include 
//using namespace cv;
//using namespace std;
 
int main()
{
    cv::String pattern="E:/tb/project/tb2/face_tb/face_tb/face_tb/face_tb/fileName/*.jpg";
    Ve ve;
    vector img=ve.ReadImage(pattern);
    return 0;
}
vector Ve::ReadImage(cv::String pattern) 
{
    vector fn;
    glob(pattern, fn, false);
    vector images;
    size_t count = fn.size(); //number of png files in images folder
	printf("%d",count);
    for (size_t i = 0; i < count; i++)
    {
		char grayFile[500];
		sprintf_s(grayFile, 500,"E:/tb/project/tb2/face_tb/face_tb/face_tb/face_tb/grayFile/%d.jpg", i); //保存图片的路径
        //images.emplace_back(cv::imread(fn[i]));
        imshow("img", imread(fn[i]));
        waitKey(100);
		imwrite(grayFile, imread(fn[i]));
    }
    return images;
}

知识补充:

sprintf_s(char *buffer,size_t sizeOfBuffer,const char *format,
[argument] ...);

注意这里的buffer指针 指向的是格式化字符后写入的首地址。

参考链接:https://www.cnblogs.com/ZY-Dream/p/9986093.html

参数列表

buffer:char型指针,指向将要写入的字符串的缓冲区。

sizeOfBuffer:缓冲区大小。

format:格式化字符串。

[argument]...:可选参数,可以是任何类型的数据

 

CV_EXPORTS_W bool 
imwrite( 
  const string& filename, 
  InputArray img,
  const vector& params=vector()
);

filename :要写入的图像名称,或带文件路径的图像名称
img    :mat数据类型
params  :特定格式保存的特殊编码,通常可以不用

 Ve.h

#pragma once
#include 

using namespace cv;
using namespace std;

class Ve {
public:
	vector ReadImage(cv::String pattern);
};

运行结果如下:

c++如何读取和存储多张图片_第1张图片

知识补充:

https://blog.csdn.net/u014768064/article/details/53068216

vector《Mat》在这里是函数返回值,vector是数组,vector《Mat》是指Mat类型的数组,c++ stl里的类模板。这里&是c++引用,引用传递参数少了对象的拷贝。
Mat值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。
Mat&引用传递:形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作

https://ask.csdn.net/questions/750785

参考:https://blog.csdn.net/ThorKing01/article/details/92836379

https://blog.csdn.net/qq_34116292/article/details/82355174

https://blog.csdn.net/xingchenbingbuyu/article/details/72628882

人工智能开发板:

c++如何读取和存储多张图片_第2张图片

你可能感兴趣的:(OPENCV,C++)