OpenCV各版本差異與演化,從1.x到4.0
部落格: ofollow,noindex" target="_blank">blog.shinelee.me |部落格園 | CSDN
寫在前面
最近因專案需要,得把OpenCV撿起來,登入 OpenCV官網 ,竟然發現release了 4.0.0-beata版本 ,所以藉此機會,查閱資料,瞭解下OpenCV各版本的差異及其演化過程,形成了以下幾點認識:
- 新版本的產生是為了順應當下的需要 ,通過版本更新,接納新技術和新方法,支援新興程式語言介面,使用新的指令集,優化效能,解決固有問題等
- 新技術新方法會優先加入到新的大版本中 ,即使新的技術方法可以在舊版本中實現,但為了推動使用者向新版本遷移,仍會優先加入到新版本中(這條看著與第1條差不多,實際意義是不同的)
- 新版本不可避免地會帶有舊版本的痕跡 ,畢竟新版本是從舊版本基礎上“生長”出來的,新老版本間能看到比較明顯的過渡痕跡,同時出於降低遷移成本的考慮,需要(部分)向前相容
因此,如果新版本已經穩定,且需要從頭開始新專案,先考慮擁抱新版本。若碰到問題,可到舊版本的資料中找找答案。但這並不絕對,具體情況還得具體分析。
下面分析下各版本的差異以及演化路徑。
OpenCV版本差異與演化,1.x To 4.0
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_imgproc 、 opencv_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。