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

opencv中的一些陷阱 坑死我了~~~~(>_<)~~~~

2015-06-11 13:41 344 查看
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得到的图像!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: