博客: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。
