您的位置:首页 > 运维架构

opencv从内存读取图片

2015-06-01 10:49 351 查看
使用场景:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: