opencv中的一些陷阱 坑死我了~~~~(_)~~~~
??????? 1.這幾天被opencv給坑的夠慘,好好的程序,先是因?yàn)閕mread()不能讀文件,整了很久沒整出來,然后改了下path路徑,沒想到后面徹底奔潰了,,,,前后大概2天吧,才在一篇博文上看到:2.4.5版本的opencv在x86路徑下相比以前的版本多了vc11路徑,但是Path環(huán)境變量設(shè)置為x86\vc11的話,最后在程序執(zhí)行時會提示MSVCP110D.dll丟失。而我就遇到了這個問題,然后在網(wǎng)上各種找dll可發(fā)現(xiàn)下的dll要不然就提示沒用,要不然就是版本不匹配,試了好久就是沒有找到匹配的,后面聽同學(xué)的把vs給卸載了重裝,重裝后還是不行,然后繼續(xù)到網(wǎng)上找原因,才找到這個原因,真的被坑大了。
??????? 2,然后就是imread讀文件問題,即使鏈接庫版本正確(debug的庫為xxxd.dll,release的庫為xxx.dll),參數(shù)正確,在debug模式下也無法讀文件,release模式下能讀文件。找了很久,終于找到解決辦法:
如果是debug版,將運(yùn)行時庫設(shè)置為:多線程調(diào)試(/ MTD)
如果是release版,將運(yùn)行時庫設(shè)置為:多線程(/ MT)
當(dāng)然,如果覺得不好用,可以換一種方法,就是通過
IplImage*iplImg = cvLoadImage(filename.c_str(),1);
Mat input_image(iplImg,true);
來獲得你需要的矩陣,這樣也很方便,不一定要在imread上面死摳,沒什么意思!
??????? 3.opencv中拷貝使用不當(dāng)導(dǎo)致內(nèi)存泄漏:
opencv中常用的拷貝函數(shù)有clone和copy,但這兩者中有些區(qū)別,clone,是完全的復(fù)制,是將被復(fù)制內(nèi)圖片內(nèi)容從內(nèi)存中完完全全的復(fù)制過去,所以要復(fù)制的圖片指針可以不要先分配內(nèi)存,而這也就導(dǎo)致了一個問題,也就是說如果這個指針已經(jīng)分配了內(nèi)存,你在clone前又沒有釋放的話,clone不會給你釋放,他只是重新給你劃定一塊空間,這樣就導(dǎo)致了內(nèi)存泄漏。還在網(wǎng)上看到一個問題“clone的源圖像消失后會影響clone而來的圖像”。我也不太明白是什么意思。但在實(shí)踐中確實(shí)有這種感覺,當(dāng)源圖像消失后clone而來的圖像感覺也變了。這邊還要請教大神。。copy是更理智的復(fù)制,如果源圖像設(shè)置了roi的話他只會復(fù)制roi。還有點(diǎn)很重要的是在使用copy前必須先為要復(fù)制的圖像分配內(nèi)存。當(dāng)然要注意大小要和被復(fù)制的圖片大小一致。也就是說copy函數(shù)不會為你分配內(nèi)存空間,而這樣做的好處也就是不會造成上面說的內(nèi)存泄露!此外就是源圖像消失后不會影響copy得到的圖像!
總結(jié)
以上是生活随笔為你收集整理的opencv中的一些陷阱 坑死我了~~~~(_)~~~~的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ES6模块的import和export用
- 下一篇: Java原生-实现SHA256算法【工具