opencv中的一些陷阱 坑死我了~~~~(_)~~~~
??????? 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得到的圖像!
總結
以上是生活随笔為你收集整理的opencv中的一些陷阱 坑死我了~~~~(_)~~~~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ES6模块的import和export用
- 下一篇: Vector的使用详解