如何學習OpenCV

本文授權轉載自賈老師的微信公眾號"OpenCV學堂"。更多信息可掃描文末二維碼關注公眾號(知乎已將二維碼轉換成鏈接,可自動跳轉到微信)。


一:學習OpenCV三個階段

人工智慧帶火了計算機視覺的人才需求,作為計算機視覺應用開發框架OpenCV也越來越受到歡迎,市場需求大增,很多人聽說了之後就迫不及待的想加入這波大軍,這其中很多人他可能懂應用編程,但是計算機視覺零基礎,一般都是我要識別個什麼,而且還有時間限制,一般都是一個月左右時間,急功近利的心態可見一斑。

學了幾個API之後看到了點效果就覺得OpenCV也沒什麼嘛,感覺跟我搞應用開發一樣啊,很快上手啦,就在這個時候發現應用場景稍微有點改變,之前那一點點的效果也沒有了,什麼都識別不了,然後又發現還有這麼多東西要學,才發現這個演算法沒聽說過、那個演算法不知道,甚至連他自己調用的演算法API那些參數是什麼意思也沒搞懂怎麼調,於是他們就會抱怨OpenCV做的也太差了,壓根不行啊,才發現做計算機視覺好難,其實是他們學習OpenCV的打開方式不對。

正確的打開方式應該是這樣:首先學習基礎,如何知道自己的圖像處理與計算機視覺的基礎如何呢,很簡單,如果你能正確回答下面的十個問題,那說明你還是有點圖像處理基礎的。

1.圖像常見的格式有

  • A.jpg
  • B.tiff
  • C.png
  • D.webp

2.常見的圖像通道數可能是:

  • A. 單通道
  • B.雙通道
  • C. 三通道
  • D.四通道

3.數字圖像中最小數據單元是什麼

  • A. 像素
  • B.亞像素
  • C.超像素
  • D.顏色

4.常說的圖像濾波是什麼數學原理

  • A. 傅立葉變換,
  • B.離散餘弦變換
  • C.卷積
  • D.距離變換

5.常見的圖像插值演算法有

  • A. 最近鄰
  • B. 雙立方
  • C. lanczos插值
  • D.雙線性

6.常見的RGB圖像每個像素點顏色值範圍

  • A. 0~1
  • B. 0~256
  • C.0~255
  • D.0~180

7.關於RGB色彩的描述下面正確的是:

  • A.RGB(255,255,255)表示黑色
  • B.RGB(0,0,255)表示藍色
  • C.RGB(255,0,0)表示綠色
  • D.RGB(0,0,0)表示白色

8.常見的圖像色彩空間有:

  • A. HSL
  • B. HSV
  • C. RGB
  • D. YCrCb

9.常見的圖形繪製時候像素渲染方法有

  • A.四鄰域渲染
  • B.八鄰域渲染
  • C.透明通道混合反鋸齒渲染
  • D.遊戲渲染

10.下面關於RGB圖像亮度與對比度說法正確的是

  • A.顏色值越高,亮度越高
  • B.降低圖像亮度會影響圖像對比度
  • C.亮度就是圖像對比度
  • D.圖像對比度就是圖像直方圖

上面10道題是圖像處理基礎知識考察,其考察目的是檢驗是否擁有學習OpenCV一些必備的基礎知識,如果你一半都沒有做對(關注公眾號,發送 【答案】兩個字,即可查看答案),我覺得暫時你應該先放下你的那些識別、檢測的目標,而是老老實實的看視頻課程或者圖書、博客文章等,釐清這些基本概念,本人根據自己學習圖像處理、計算機視覺與OpenCV親身經歷,總結一個學習路線圖,僅供大家參考:

大致分為三個階段,第一個階段應該是基礎,第二個階段是提升、第三個階段是應用,而很多初學者一般都看重的是第三部分,素不知前面還有N多東西沒學,正所謂「千里之行,始於足下」。只有走好學習OpenCV的第一步我們才能走好剩下的999步。否則就會出現「欲速則不達」的尷尬局面,貌似懂,一做應用什麼都不行,調用哪個OpenCV演算法函數都無法解決問題的進退維谷之中。

二:做內外兼修的OpenCV開發者

OpenCV3.x中集成了超過1000個演算法模塊,這些演算法如何組合使用,他們的參數意義,演算法的原理與適用場景條件等各不相同,要成為一個真正的OpenCV開發高手,必須精通常見的演算法原理,各個參數意義,參數使用等。

就拿我們最常見的OpenCV中HAAR人臉檢測來說吧,整個代碼演示我可以做到20行以內實現,但是具體到應用場景,我就聽到有人跟我說HAAR級聯人臉檢測速度太慢了這樣的抱怨,原因是他連最基本的各個參數是什麼意思都沒搞清楚,更談不上調參數優化啦HAAR級聯檢測器API調用如下:

void cv::CascadeClassifier::detectMultiScale( InputArray image, std::vector<Rect> & objects, double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size() )

  • 第一個參數image是輸入圖像 第二個參數objects檢測到的人臉BOX位置信息
  • 第三個參數是放縮比率,這個參數是用來構建HAAR多尺度用的
  • 第四個參數是計算人臉BOX的最小相鄰個數 第五個參數是標誌,在OpenCV3.0以後的版本中已經不再使用,沒有任意意義
  • 第六個參數是檢測人臉時,可以檢出BOX的最小寬高
  • 第七個參數是檢測人臉時,可以檢出BOX的最大寬高

上述的七個參數,對檢測速度與檢測結果影響比較大的分別是第三、第四、第六、第七個參數,第六與第七個參數是設置大小,這個很容易理解,比較難理解的是第四個,最小相鄰個數,假設最小相鄰數目取3、則有下圖:

表示在最終紅色BOX人臉檢測結果是基於HAAR級聯檢測磚紅色、青色、藍色框的求得平均值得到紅色BOX框,理論上3表示至少有三個候選,這個參數值越大,檢測結果輸出人臉的準確率越高,同樣耗時也會越長、還會導致漏檢率增加。

而很多初學者沒有仔細了解該參數的意義,更無從談起如何優化參數,另外三個參數,如果考慮速度的話,最好設置最大與最小可檢測人臉BOX範圍,這裡有利於減少計算時間,提升實時性能。這裡只是通過這個例子來說明OpenCV中的各個演算法API參數重要性,要成為OpenCV開發高手,個人認為要做到內外兼修,這裡內是指相關數學、演算法論文都認真讀、仔細的研究,不斷加深對相關演算法的理解與領悟;外是指要加強動手能力,編程能力,做為OpenCV開發者我們首要職責就是負責讓視覺相關應用落地,沒有很強悍的工程能力與解決問題能力很難做到這點。結合本人的親身實踐和學習路徑,建議在學習OpenCV 編程時搞清楚幾點對學習更加有幫助

  • 學習API函數時查找相關論文,嘗試閱讀論文
  • 搞清楚學到的每個演算法相關數學基礎,嘗試理解相關參數意義
  • 學會看OpenCV官方的文檔與代碼示例
  • 古語云「獨學而無有、孤陋則寡聞」,所以多認識一些OpenCV學習者與開發者
  • 從最新版本開始學習,OpenCV已經發布了OpenCV3.4.1最新版本,建議學習從OpenCV3.4開始學習,避免學習一些過期的API給自己帶來不必要的煩惱與負擔。
  • C++還是Python,當前OpenCV SDK支持C++與Python SDK,所以無論選擇哪一種語言都可以學習OpenCV。

三:關注業界動態、緊跟技術潮流

如果你成功了經歷了前面幾個階段,應該恭喜你是一個真正的OpenCV開發者啦,但是這個時候還有清醒的意識到你只是一個知道和熟悉常見OpenCV中演算法、使用它們解決實際問題的開發者而已,要學會關注業界動態,關注OpenCV框架的新發展與新動向、特別是新演算法在OpenCV框架中的實現與SDK發布。

舉例來說DNN模塊發布已經快一年了,本人一直跟蹤OpenCV的每個Release、深刻感受到它的功能越來越完善與強大,個人觀點以後OpenCV的大部分對象檢測與識別都可能基於DNN模塊實現,這樣的好處是對開發者顯而易見,即降低了學習門檻,有提高了檢測準確性與精度,對於DNN這樣的新模塊,作為OpenCV開發者的你是否一直在不斷跟蹤它,另外注意學術界的動態,OpenCV社區會很快把一些最新CVPR上面的論文變成想法演算法模塊的,所以對一些影響比較大的CVPR的論文有條件要及時跟進閱讀與理解。

很多人想學習人工智慧相關的熱門技術,我覺得OpenCV就是很接地氣,也很好的方向選擇,也不需要太過深奧的數學知識,即使零基礎也可以學會、學好。正如古人所說「假輿馬者,非利足也,而致千里;假舟楫者,非能水也,而絕江河。君子生非異也,善假於物也」,藉助OpenCV這個神兵利器,開發者也會從檢測到識別無所不能。


後記

也許不適合所有人,但是如果能對初學者有一點幫助,也算值得我寫下上面幾百字的肺腑之言了!

千里之行、始於足下。


OpenCV學堂公眾號??

weixin.qq.com/r/-UwcBEz (二維碼自動識別)

另外宣傳一波公眾號博主賈老師的線上課程(部分課程需要自掏腰包)

賈志剛的網路課堂,賈志剛 深度學習,計算機視覺,自然語言 大講堂 - 51CTO學院特級講師?

edu.51cto.com圖標


最後的最後

如果喜歡小林的專欄,就收藏了吧!してください!


推薦閱讀:

2017年歷史文章匯總|深度學習
讀論文系列:Object Detection NIPS2015 Faster RCNN
菜鳥學tensorflow
【CVPR2018正式公布】行人重識別論文
【小林的OpenCV基礎課 10】Canny邊緣檢測

TAG:計算機視覺 | OpenCV |