1. 程式人生 > >OpenCV各版本差異與演化,從1.x到4.0

OpenCV各版本差異與演化,從1.x到4.0

部落格:blog.shinelee.me | 部落格園 | CSDN

寫在前面

最近因專案需要,得把OpenCV撿起來,登入OpenCV官網,竟然發現release了4.0.0-beata版本,所以藉此機會,查閱資料,瞭解下OpenCV各版本的差異及其演化過程,形成了以下幾點認識:

  1. 新版本的產生是為了順應當下的需要,通過版本更新,接納新技術和新方法,支援新興程式語言介面,使用新的指令集,優化效能,解決固有問題等
  2. 新技術新方法會優先加入到新的大版本中,即使新的技術方法可以在舊版本中實現,但為了推動使用者向新版本遷移,仍會優先加入到新版本中(這條看著與第1條差不多,實際意義是不同的)
  3. 新版本不可避免地會帶有舊版本的痕跡
    ,畢竟新版本是從舊版本基礎上“生長”出來的,新老版本間能看到比較明顯的過渡痕跡,同時出於降低遷移成本的考慮,需要(部分)向前相容

因此,如果新版本已經穩定,且需要從頭開始新專案,先考慮擁抱新版本。若碰到問題,可到舊版本的資料中找找答案。但這並不絕對,具體情況還得具體分析。

下面分析下各版本的差異以及演化路徑。

OpenCV版本差異與演化,1.x To 4.0

OpenCV

OpenCV 1.x

OpenCV 最初基於C語言開發,API也都是基於C的,面臨記憶體管理、指標等C語言固有的麻煩。

2006年10月1.0釋出時,部分使用了C++,同時支援Python,其中已經有了random trees、boosted trees、neural nets等機器學習方法,完善對圖形介面的支援。

2008年10月1.1pre1釋出,使用 VS2005構建,Python bindings支援Python 2.6,Linux下支援Octave bindings,在這一版本中加入了SURF、RANSAC、Fast approximate nearest neighbor search等,Face Detection (cvHaarDetectObjects)也變得更快。

OpenCV 2.x

當C++流行起來,OpenCV 2.x釋出,其儘量使用C++而不是C,但是為了向前相容,仍保留了對C API的支援。從2010年開始,2.x決定不再頻繁支援和更新C API,而是focus在C++ API,C API僅作備份。

2009年9月2.0 beta釋出,主要使用CMake構建,加入了很多新特徵、描述子等,如FAST、LBP等。

2010年4月2.1版本,加入了Grabcut等,可以使用SSE/SSE2…指令集。

2010年10月2.2版本釋出,OpenCV的模組變成了大家熟悉的模樣,像opencv_imgprocopencv_features2d等,同時有了opencv_contrib用於放置尚未成熟的程式碼,opencv_gpu放置使用CUDA加速的OpenCV函式。

2011年6月起的2.3.x版本、2012年4月起的2.4.x版本,一面增加新方法,一面修復bug,同時加強對GPU、Java for Android、 OpenCL、並行化的支援等等,OpenCV愈加穩定完善,值得注意的是 SIFT和SURF從2.4開始被放到了nonfree 模組(因為專利)。

考慮到過渡,OpenCV 2.4.x仍在維護,不過以後可能僅做bug修復和效率提升,不再增加新功能——鼓勵向3.x遷移。

OpenCV 3.x

隨著3.x的釋出,1.x的C API將被淘汰不再被支援,以後C API可能通過C++原始碼自動生成。3.x與2.x不完全相容,與2.x相比,主要的不同之處在於OpenCV 3.x 的大部分方法都使用了OpenCL加速

2014年8月3.0 alpha釋出,除大部分方法都使用OpenCL加速外,3.x預設包含以及使用IPP,同時,matlab bindings、Face Recognition、SIFT、SURF、 text detector、motion templates & simple flow 等都移到了opencv_contrib下(opencv_contrib不僅存放了尚未穩定的程式碼,同時也存放了涉及專利保護的技術實現),大量湧現的新方法也包含在其中。

2017年8月3.3版本,2017年12月開始的3.4.x版本,opencv_dnn從opencv_contrib移至opencv,同時OpenCV開始支援C++ 11構建,之後明顯感到對神經網路的支援在加強,opencv_dnn被持續改進和擴充。

OpenCV 4.0

2018年10月4.0.0釋出,OpenCV開始需要支援C++11的編譯器才能編譯,同時對幾百個基礎函式使用 "wide universal intrinsics"重寫,這些行內函數可以根據目標平臺和編譯選項對映為SSE2、 SSE4、 AVX2、NEON 或者 VSX 行內函數,獲得性能提升。此外,還加入了QR code的檢測和識別,以及Kinect Fusion algorithm,DNN也在持續改善和擴充。

總結

這些年來,計算機視覺領域的新技術新方法不斷湧現,指令集、程式語言和並行化技術越發先進,OpenCV也在緊跟時代的腳步,不斷吸收完善自身。本文僅對OpenCV的演化過程僅總結了部分要點,詳細可參見 OpenCV 在 github上的ChangeLog。

參考