本文主要是介绍cv::imdecode 效率问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
cv::Mat imgTmp; // image objectimgTmp = cv::imdecode(cv::Mat(1, size, CV_8UC1,buf), CV_LOAD_IMAGE_UNCHANGED);
if(!imgTmp.data) //判断图片调入是否成功
return -1; //调入图片失败则退出
imdecode效率慢是因为OpenCV2.4.5及之前的版本实现的时候犯2了。因为opencv也是先写文件然后调用cvloadimage的。。。然后2.4.5及之前版本实现的时候申请的临时文件没有删除,所以如果使用这个函数超过65535次,临时文件就满了,所以每次调用需要检查65535次临时文件是否存在,因而速度很慢……
2.4.6及之后的版本就没有这个问题了~
PS:
发现opencv也是先将内存数据写到文件然后再读取的……这不是偷懒么orz
OpenCV是很好用的开源库,不过,还是有一些BUG的~
比如,今天遇到的问题是,imdecode的执行速度很慢。
照理来说,imdecode是从内存解析一幅图像,应该比cvLoadImage还快(或者至少不慢)。
但实际上,执行的时候却是imdecode慢很多(一张图片要1秒以上)。而且很奇怪的是,在某些机器很快,某些机器就很慢。而且调用了不同版本的OpenCV速度也不同。
为什么呢?本着质疑的原则,开始查看OpenCV的源代码。
imdecode的实现在modules\highgui\src\loadsave.cpp中。结果,发现opencv也是先将内存数据写到文件然后再读取的……这不是偷懒么
不过,逻辑上没有问题,算法上却犯二了……OpenCV2.4.2及之前版本在实现这个函数的时候,申请了一个临时文件(C:\user\用户名\AppData\Local\Temp\下的ocvXXXX.tmp文件,其中XXXX是0~F的16进制数)。然后写这个文件,然后读。关键是,没有删除!原因是因为临时文件可能不存在(本意是如果形如ocvXXXX.tmp的文件都存在了,那么就不能再新建了,所以返回空不作操作,实际上不会走到这一步),所以最后不一定需要删除文件。于是写OpenCV的小朋友这里为了程序稳定就没有删除临时文件。如图所示:
这篇关于cv::imdecode 效率问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!