opencv从内存读取图片
2015-06-01 10:49
351 查看
使用场景:
cv_2.4.1/ cpp/linux,我有一内存的文件内存快,是一图片。需要读取到Mat中。
原方案是io保存一次,然后执行imread。后面细想,这个方案要消耗两次IO,很浪费。能否绕过IO的瓶颈呢?
然后我去查CV的文档,有imdecode这样的接口
满心欢喜,内存快转array,可以解码到Mat中。
编译运行,ok。
然后测试性能。。
我把一个图片读取之后,转换10000次,并写出来。
和我原方案相比,没有什么提升。很困惑,猜测imdecode是否也执行了保存流成文件的过程?Google上面瞅了一下。貌似是这个情况(没查阅源码验证)。想想,写这个接口的CV的成员真扯蛋。imread等接口肯定也需要将图片加载到内存的。为何写一个imdecode却这么投机。
Google了imread,其最终是调用fopen实现加载的。所以应该是可以跳过IO的步骤的。要修改增加CV的源码,不是很理想的办法。
参考blog.csdn.net/songzitea/article/details/11096287
cv_2.4.1/ cpp/linux,我有一内存的文件内存快,是一图片。需要读取到Mat中。
原方案是io保存一次,然后执行imread。后面细想,这个方案要消耗两次IO,很浪费。能否绕过IO的瓶颈呢?
然后我去查CV的文档,有imdecode这样的接口
Reads an image from a buffer in memory. C++: Mat imdecode(InputArray buf, int flags)
满心欢喜,内存快转array,可以解码到Mat中。
#include <iterator> void memtoMat(){ std::ifstream file("./test.png"); std::vector<char> data; file >> std::noskipws; std::copy(std::istream_iterator<char>(file), std::istream_iterator<char>(), std::back_inserter(data)); Mat matrixJprg = imdecode(Mat(data), CV_LOAD_IMAGE_COLOR); imwrite("./result.jpg",matrixJprg); }
编译运行,ok。
然后测试性能。。
我把一个图片读取之后,转换10000次,并写出来。
$ time ./main
和我原方案相比,没有什么提升。很困惑,猜测imdecode是否也执行了保存流成文件的过程?Google上面瞅了一下。貌似是这个情况(没查阅源码验证)。想想,写这个接口的CV的成员真扯蛋。imread等接口肯定也需要将图片加载到内存的。为何写一个imdecode却这么投机。
Google了imread,其最终是调用fopen实现加载的。所以应该是可以跳过IO的步骤的。要修改增加CV的源码,不是很理想的办法。
参考blog.csdn.net/songzitea/article/details/11096287
相关文章推荐
- 基于Linux的BeagleBoard-xm终端开发环境搭建
- linux 端口占用查看
- CentOS下桥接模式设置静态IP的方法
- 基于xmpp openfire smack开发之openfire介绍和部署[1]
- linuxIO刷新机制fsync和fdatasync详解
- centos 下 Qt Creator 的安装使用
- Properties 类
- Linux守护进程的编程实现
- 好的书籍下载网站
- eclipse部署非WEB项目到Tomcat
- tomcat 启动不了的原因
- 单片机和嵌入式系统linux的区别
- Android系统架构之微服务架构
- 有用的shell命令
- Linux C学习笔记06--Tlist使用(编程工具篇)
- centos 卸载自带的 java
- Linux进程间通信_IPC方法综述
- Mapreduce TopK
- Linux 常用命令
- centos 终端 字体颜色