使用场景:
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