最近在项目中用到了图像字典,即需要一次性读入大量的图片数据作为参考(主要就是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;
}

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


opencv快速读写大量图片的方法相关推荐

  1. C/C++快速读写磁盘数据的方法-块读取/异步/优化分析算法/内存文件映射的原理和使用

    快速读写磁盘数据的方法: 1.块读取:一下子将数据读取到内存的(无论是文本还是二进制),而不是一行行的读取. 2.异步的IO,创建多线程,或者使用重叠IO,IO复用,异步的事件回调通知机制(可以用事件 ...

  2. 【蓝桥杯】Java组必备API类 --快速读写实现方法 及输入输出的巧妙处理

    输入和输出 输入 Scanner s = new Scanner(System.in); //声明一个从控制台中读入数据的对象 int x = s.nextInt(); double x = s.ne ...

  3. Opencv快速入门(C++版),新手向

    Opencv快速入门(C++版) 前言 1.图像的读取与显示 所使用的API接口: 代码演示: 2.图像色彩空间转换 所使用的API接口: 代码演示: 3.图像对象的创建与赋值 所使用的API接口: ...

  4. OpenCV快速傅里叶变换(FFT)用于图像和视讯流的模糊检测

    OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测 翻译自[OpenCV Fast Fourier Transform (FFT) for blur detection in images ...

  5. opencv快速入门人脸检测与人脸识别

    让"它"认得你 --利用opencv快速入门人脸检测与人脸识别 opencv,顾名思义"开源,计算机视觉".OpenCV就是这样的一个特殊的框架,一群大牛然绕自 ...

  6. 一次代码重构之旅-快速读写xml文件工具类封装

    为了满足系统的灵活性,有些功能经常需要用到配置文件,一般是xml格式的居多.如何能快速读写配置文件呢? 以前都是用dom4j提供的api来读写xml文件,用dom4j读写配置文件总感觉像是在结构化的处 ...

  7. opencv python3 找图片不同_如何使用OpenCV快速寻找定位图像差异

    原标题:如何使用OpenCV快速寻找定位图像差异 如何使用结构相似性指数(SSIM)将两个图像与Python进行比较. 使用这种方法,我们能够轻松确定两个图像是否相同或由于轻微的图像处理,压缩伪像或有 ...

  8. mysql回滚用法_Mysql误操作后利用binlog2sql快速回滚的方法详解

    前言 在日常工作或者学习中,操作数据库时候难免会因为"大意"而误操作,需要快速恢复的话通过备份来恢复是不太可能的,下面这篇文章主要给大家介绍关于Mysql误操作后利用binlog2 ...

  9. yolt 卫星图像进行快速目标识别的新方法

    "只需看两次"--对卫星图像进行快速目标识别的新方法 Bing 极市平台 今天 ↑ 点击蓝字关注极市平台 识别先机 创造未来 来源:论智 原文地址:arxiv.org/pdf/18 ...

最新文章

  1. java webpack web项目_官方出品,微信小程序和 Web 端同构解决方案——kbone
  2. python游戏脚本实例-使用Python写一个贪吃蛇游戏实例代码
  3. 20051008:看了AppleSeed,领悟到了一个道理:
  4. java中arges.length_java中的args.length
  5. Docker 三剑客
  6. 2013_nanjing_online
  7. 年轻人的第一篇V语言笔记
  8. [转载]基于TFS实践敏捷-工作项跟踪
  9. java----数据结构与算法----JavaAPI:java.util.Collection接口
  10. tp6 获取session_thinkphp6不能设置session以及模板无法获取session的坑附解决办法
  11. php choosewxpay fail,人人商城常见问题解决方案
  12. linux fedora14 u盘运行,通过U盘安装Fedora-14-i686-Live-Desktop
  13. urllib库(三)parse模块:quote()/quote_plus(),unquote()/unquote_plus(),quote_from_bytes()
  14. Autodesk Eagle入门之-线宽操作
  15. 关于sourcetree这是一个无效源路径的解决办法
  16. 海王夺回王位科学深意:杂种是怎么一步步主宰地球的
  17. 投资心理和关于延迟满足的三个实验
  18. mysql中if多重判断使用
  19. 2017 ACM - ICPC Asia Ho Chi Minh City Regional Contest
  20. Kali开机后的初始化配置

热门文章

  1. 中国移动MCU CM32M101A-B128-LQFP64软硬件通用STM32F103RBT6
  2. 学习笔记--微信小程序简单设置背景颜色
  3. 九号机器人田奇峰_九号机器人三款新品亮相 以全新视角解读服务机器人产业...
  4. png的计算机储存图片的格式吗,png图片怎样转换成jpg格式
  5. (基于matlab的)应变传感器数据处理方法(电阻-应变)
  6. Sqoop 安装配置、指令介绍【导入、导出】
  7. (郁闷p2pover中)整理记录三
  8. 如何学好游戏3D引擎编程的一些经验
  9. 火狐浏览器自动登录百度和CSDN等各个平台
  10. 抖音信息流广告是什么