cv::imdecode 效率问题
2015-08-21 20:15
232 查看
cv::Mat imgTmp; // image object
imgTmp = 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的小朋友这里为了程序稳定就没有删除临时文件。如图所示:
imgTmp = 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的小朋友这里为了程序稳定就没有删除临时文件。如图所示:
相关文章推荐
- 输出单向链表中倒数第k个结点
- 洛谷1068 分数线划定 解题报告
- [转] valuestack,stackContext,ActionContext.之间的关系
- GDOI 8.21模拟
- 继续畅通工程(2008浙江大学研究生复试上机题[最小生成树] hdoj 1879 )
- Makefile中的ifeq 多条件使用
- SDKD Summer Team Contest R
- http://blog.163.com/gobby_1110/blog/static/29281715201352004329356/
- PMBOK项目管理认知概要
- HDU:1465不容易系列之一 解题心得
- PHP相关图书推荐
- [杂谈]机器学习:数学、概率与人工智能
- 深入理解JavaScript系列(27):设计模式之建造者模式
- Convert QWERTY to Dvorak ZOJ 3878
- 原因好消息: 自己主动算法设计推箱子游戏(三)
- Centos5.5 安装memcache
- servlet清晰理解
- <Araxis Merge>保存文件
- cocos2dx 3.7中 AppDelegate.h的class TestController;这种写法的具体意思不太明白,只能猜是类似于外部定义的东西。
- ACM大一练习赛-第三场------G - EPR悖论<克鲁斯卡尔算法>