原文链接点击打开链接
没试过,暂存备忘
最近在项目中用到了图像字典,即需要一次性读入大量的图片数据作为参考(主要就是rgb三个维度的矩阵数据)。原本算法部分在matlab上做测试时,matlab的数据格式.mat支持大量数据的快速导入导出,但项目转移到opencv上时问题就出现了,opencv不能直接使用.mat文件。后来尝试了各种方法,包括.txt,还有opencv自带的.yml格式文件,速度都相当慢。.txt一般适合做配置文件,在数据量较小的时候可以使用,.yml则适合少量的图片存储。下面分别介绍大量图片的读写方法
opencv写入大量图片
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
ofstream outfile;
outfile.open("data.bin", ios::binary);
vector files;
string dir_path = "E:\\dict\\*.bmp"; //读取该目录下所有.bmp格式的文件
glob(dir_path, files, true);
for (int i = 0; i < files.size(); i++)
{
Mat Iface = imread(files[i].c_str());
for (int r = 0; r < Iface.rows; r++)
outfile.write(reinterpret_cast(Iface.ptr(r)), Iface.cols*Iface.elemSize());
//cout << i << endl;
}
运行完之后会生成一个data.bin文件,二进制格式的文件也不用担心像txt一样被编辑了。这里我测试了六七百张图片,一瞬间就完成了写入,我想一两千张图片的速度应该也不错。
opencv读取大量图片
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
int height = 200;
int width = 200;
int img_num = 700;//字典中图片的尺寸与图片总数量需提前知道
ifstream infile;
vector dict;
infile.open("data.bin", ios::binary);
Mat img = Mat::zeros(height, width, CV_8UC3);
for (int num = 0; num < img_num; num++)
{
for (int r = num; r < num+img.rows; r++)
infile.read(reinterpret_cast(img.ptr(r-num)), img.cols*img.elemSize());
dict.push_back(img);
}
}
读取图片也是一瞬间就完成了,有一点不好就是需要提前知道字典里面图片的尺寸和图片的总数量。我想应该可以通过换行符或者终止符这些进行判断,不过我目前的项目要求没这么细,所以暂不深究,感兴趣的朋友可以试试看。