opencv中的一些陷阱

转自:http://blog.csdn.net/lh1162810317/article/details/23792247

1.这几天被opencv给坑的够惨,好好的程序,先是因为imread()不能读文件,整了很久没整出来,然后改了下path路径,没想到后面彻底奔溃了,,,,前后大概2天吧,才在一篇博文上看到:2.4.5版本的opencv在x86路径下相比以前的版本多了vc11路径,但是Path环境变量设置为x86\vc11的话,最后在程序执行时会提示MSVCP110D.dll丢失。而我就遇到了这个问题,然后在网上各种找dll可发现下的dll要不然就提示没用,要不然就是版本不匹配,试了好久就是没有找到匹配的,后面听同学的把vs给卸载了重装,重装后还是不行,然后继续到网上找原因,才找到这个原因,真的被坑大了。

2,然后就是imread读文件问题,即使链接库版本正确(debug的库为xxxd.dll,release的库为xxx.dll),参数正确,在debug模式下也无法读文件,release模式下能读文件。找了很久,终于找到解决办法:

如果是debug版,将运行时库设置为:多线程调试(/ MTD)

如果是release版,将运行时库设置为:多线程(/ MT)

当然,如果觉得不好用,可以换一种方法,就是通过

IplImage*iplImg = cvLoadImage(filename.c_str(),1);
Mat input_image(iplImg,true);

来获得你需要的矩阵,这样也很方便,不一定要在imread上面死抠,没什么意思!

3.opencv中拷贝使用不当导致内存泄漏:

opencv中常用的拷贝函数有clone和copy,但这两者中有些区别,clone,是完全的复制,是将被复制内图片内容从内存中完完全全的复制过去,所以要复制的图片指针可以不要先分配内存,而这也就导致了一个问题,也就是说如果这个指针已经分配了内存,你在clone前又没有释放的话,clone不会给你释放,他只是重新给你划定一块空间,这样就导致了内存泄漏。还在网上看到一个问题“clone的源图像消失后会影响clone而来的图像”。我也不太明白是什么意思。但在实践中确实有这种感觉,当源图像消失后clone而来的图像感觉也变了。这边还要请教大神。。copy是更理智的复制,如果源图像设置了roi的话他只会复制roi。还有点很重要的是在使用copy前必须先为要复制的图像分配内存。当然要注意大小要和被复制的图片大小一致。也就是说copy函数不会为你分配内存空间,而这样做的好处也就是不会造成上面说的内存泄露!此外就是源图像消失后不会影响copy得到的图像!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值