opencv快速读写大量图片的方法

最近在项目中用到了图像字典,即需要一次性读入大量的图片数据作为参考(主要就是rgb三个维度的矩阵数据)。原本算法部分在matlab上做测试时,matlab的数据格式.mat支持大量数据的快速导入导出,但项目转移到opencv上时问题就出现了,opencv不能直接使用.mat文件。后来尝试了各种方法,包括.txt,还有opencv自带的.yml格式文件,速度都相当慢。.txt一般适合做配置文件,在数据量较小的时候可以使用,.yml则适合少量的图片存储。下面分别介绍大量图片的读写方法,参考的是这里

opencv写入大量图片

#include <iostream>
#include <fstream>
#include <vector>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
    ofstream outfile;
    outfile.open("data.bin", ios::binary);

    vector<String> 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<const char*>(Iface.ptr(r)), Iface.cols*Iface.elemSize());
        //cout << i << endl;
    }
    return 0;
}

运行完之后会生成一个data.bin文件,二进制格式的文件也不用担心像txt一样被编辑了。这里我测试了六七百张图片,一瞬间就完成了写入,我想一两千张图片的速度应该也不错。

opencv读取大量图片

#include <iostream>
#include <fstream>
#include <vector>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
    int height = 200;
    int width = 200;
    int img_num = 700;//字典中图片的尺寸与图片总数量需提前知道

    ifstream infile;
    vector<Mat> 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<char*>(img.ptr(r-num)), img.cols*img.elemSize());

        dict.push_back(img.clone());//注意这个clone很重要,否则vector的内容就都是一样了
    }
    return 0;
}

读取图片也是一瞬间就完成了,有一点不好就是需要提前知道字典里面图片的尺寸和图片的总数量。我想应该可以通过换行符或者终止符这些进行判断,不过我目前的项目要求没这么细,所以暂不深究,感兴趣的朋友可以试试看。


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值