談opencv的長處與短處

2021-04-25 17:25:51 字數 1943 閱讀 2166

opencv是乙個開源的計算機視覺開發包,這已是眾所周知的了,而且越來越多的人開始研究它了。但opencv的使用者還是以高校居多,企業用得比較少,而企業使用opencv也往往是借鑑它的一些演算法。

個人認為opencv可以作為教材的好處在於,一般教材中涉及到的影象處理的基本概念、理論,opencv中都有完美體現,比如說影象處理往往不得不提到的閾值分割、邊緣提取這些基本常識,opencv裡都提供了很好的演算法來實現。而這些函式,光看引數就發現它們很容易理解,跟我們平時見到的差不多,如果讓自己去實現演算法,往往能跟它的效果接近。而且,作為開源,我們去分析它的源**,對自己也是一種提高。

舉個很簡單的例子,工業視覺中往往要用到模板匹配,opencv裡其實也有這個功能,只是很多人不知道怎麼去用。先說最簡單的那個cvmatchtemplate函式吧,看看函式說明知道是做模板匹配的,但匹配了怎麼得到匹配中心的資料呢,這就要靠你去分析。首先,呼叫這個函式後實際上做了什麼你要明白。其實這個函式就是拿一幅影象跟模板影象在做比較,比較結果還是一幅影象,這幅影象只不過不是一幅單純的灰度影象而已。如果你知道比較後變成的是一幅影象,你就明白了,這個模板匹配是什麼意思了。因為是在找模板與影象的相似程度,所以比較結果後影象最亮的地方就是匹配最好的地方了,換句話說,就是匹配中心。知道這個了,還會不知道找一幅影象中存在多個目標物件怎麼找嗎?而且,也能知道怎麼來計算二者的相似性大小了。

cvmatchtemplate只不過是個灰度匹配,灰度匹配的特長就是精度高,因為是乙個個畫素點在比較。但缺點就是計算時間長,因為要計算的點多,乙個個比較花費很長時間。如果我們從影象金字塔的角度,把模板和影象都降低解析度來匹配,這樣時間又能提高乙個數量級。但問題是,解析度要降低到多少是合適的。這就得有個理論問題了,往往很少人去研究這個問題。就如我們看乙個東西,縮小到什麼時候辨認不出是什麼了的時候,就是解析度的最小極限了。這個本人做過深入研究後發現,其實灰度影象的模板匹配,模板上的點能取到的最小值基本上是個定值(這個值是個常量,一般人我不告訴他,呵呵)。

還有乙個匹配的函式cvmatchshapes,估計能把這個函式用熟的人不多,其實這就是個形狀匹配的,這個函式本身寫的不錯,但沒有進行很好的優化,結果效果往往不讓人滿意,這就是作為開發的侷限性,如果優化得太好了,那麼很多任務業應用就用不著再買其它的軟體了。

cvmatchcontourtrees與cvmatchshapes都是一樣,空有架子,但沒有多大實際用處,還有乙個是輪廓直方圖比較的函式,這幾個函式都是一樣,內部優化很一般。

ok,說完匹配,我們看看邊緣提取,幾個邊緣提取運算元寫的不錯,尤其是canny,其效果不比市面上的軟體差。但canny演算法的優化度還是不過,比較一下halcon,就會發現,人家用的其它邊緣提取演算法,效果都好得不得了,這就是優化問題。

還有閾值分割,opencv的方式很單一,還有很多經典的分割演算法都沒有用到。這就是它的有限性。其實,opencv的演算法處理速度很多時候要打乙個折扣就在於,函式內部太多地方用到巨集定義和讀取一些沒有用的函式申明和版本資訊,這些無疑放慢了處理速度。開源的也就罷了,何必還計較那些個版權問題呢。

還有的人說opencv裡面的dll和函式能不能改,簡單的說,因為是開源的,你想怎麼改就都行。本人曾因為要經常應用到裡面的幾個函式,因為它實在是沒有怎麼優化,於是就改了不少地方,然後重新編譯,同樣的好使。給客戶做乙個小系統,人家說不能看出是opencv做的,我說no problem,把opencv的dll重新命個名字,就叫客戶公司名,這樣就看不出來的了(一般外行是看不出的)。

再說說opencv如何來優化,其實優化的前提是你得讀懂了人家的**,演算法上有的地方本來用不到好幾個for迴圈的,你最好不用,有的地方用不著要浮點計算的,你也不需要用它,還有,多結合實際,這就能做到乙個更好的優化。簡單的說,opencv裡hough 變換 來找圓和線,實際效果差得不是一般,你如果能從函式內部,把那些影象做個預處理,該平滑的平滑一下,該去掉不要的特徵的地方去除一些,你再來hough 變換一些,效果不只是好10倍。很多時候,演算法是死的,人是活的,在使用這個函式前,你先對影象做些處理,讓它在下乙個函式處理的時候更接近理論上的條件,這樣處理出來的結果肯定是大不一樣的。

談OpenCV的資料結構Mat,是如此強大

還是乙個實時性要求的程式最近把我弄得有些上火。為了提高 執行的速度,我也是又新啃東西學了。由於我 裡使用了vector,網上搜來搜去有人說vector慢,又有人說stl裡的sort排序速度是我等常人不能企及的,有人說要少resize,這個重新分配記憶體非常耗時,又有人說要用swap來徹底刪除不要的記...

OpenCV的安裝與配置

解壓opencv到任意資料夾 解壓資料夾的以下路徑中找到cv2.pyd,路徑opencv build python 2.7 x86。將cv2.pyd賦值到python安裝目錄下的c python27 lib site packages資料夾下。測試 import cv2 print cv2.vers...

Opencv2與opencv1的區別

一 opencv2與opencv1的區別 opencv1.0 版本於2006年面世,主要基於c語言。2009年發布opencv2,主要基於c 此時opencv庫被劃分成多個模組,這些模組被編譯成庫檔案後,位於lib資料夾中。主要有以下模組 版本1的結構見我的這篇blog opencv core 模組...