opencv从内存读取图片

使用场景:

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值