Opencv学习笔记之OpenCV介绍
一.? OpenCV介紹
OpenCV是一個基于BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。
OpenCV用C++語言編寫,它的主要接口也是C++語言,但是依然保留了大量的C語言接口。該庫也有大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。這些語言的API接口函數可以通過在線文檔獲得。如今也提供對于C#、Ch、Ruby,GO的支持。
二. OpenCV發展歷程
2.1 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)也變得更快。
2.2 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遷移。
2.3 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被持續改進和擴充。
2.4 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也在持續改善和擴充。
3. OpenCV架構
【calib3d】——這個模塊名稱是由calibration(校準)和3D這兩個單詞的縮寫組合而成,通過名字我們可以知道,模塊主要包含相機標定與立體視覺等功能,例如物體位姿估計、三維重建、攝像頭標定等。
【core】——核心功能模塊,模塊主要包含 OpenCV 庫的基礎結構以及基本操作,例如OpenCV基本數據結構、繪圖函數、數組操作相關函數、動態數據結構等。
【dnn】——深度學習模塊,這個模塊是OpenCV 4版本的一個特色,其主要包括構建神經網絡、加載序列化網絡模型等。但是該模塊目前僅適用于正向傳遞計算(測試網絡),原則上不支持反向計算(訓練網絡)。
【features2d】——這個模塊名稱是由features(特征)和2D這兩個單詞的縮寫組合而成,其功能主要為處理圖像特征點,例如特征檢測、描述與匹配等。
【flann】——這個模塊名稱是Fast Library for Approximate Nearest Neighbors(快速近似最近鄰庫)的縮寫,這個模塊是高維的近似近鄰快速搜索算法庫,主要包含快速近似最近鄰搜索與聚類等。
【gapi】——這個模塊是OpenCV 4.0中新增加的模塊,旨在加速常規的圖像處理,與其他模塊相比,這個模塊主要充當框架而不是某些特定的計算機視覺算法。
【highgui】——高層GUI圖形用戶界面,包含創建和操作顯示圖像的窗口、處理鼠標事件以及鍵盤命令、提供圖形交互可視化界面等。
【imgcodecs】——圖像文件讀取與保存模塊,主要用于圖像文件讀取與保存。
【imgproc】——這個模塊名稱是由image(圖像)和process(處理)兩個單詞的縮寫組和而成,是重要的圖像處理模塊,其主要包括圖像濾波、幾何變換、直方圖、特征檢測與目標檢測等。
【ml】——機器學習模塊,主要為統計分類、回歸和數據聚類等。
【objdetect】——目標檢測模塊,主要用于圖像目標檢測,例如檢測Haar特征。
【photo】——計算攝影模塊,主要包含圖像修復和去噪等。
【stitching】——圖像拼接模塊,主要包含特征點尋找與匹配圖像、估計旋轉、自動校準、接縫估計等圖像拼接過程的相關內容。
【video】——視頻分析模塊,主要包含運動估計、背景分離、對象跟蹤等視頻處理相關內容。
【videoio】——視頻輸入輸出模塊,主要用于讀取與寫入視頻或者圖像序列。
通過對OpenCV 4.1的模塊構架的介紹,相信讀者已經對OpenCV 4.1整體架構有了一定的了解。其實簡單來說OpenCV就是將眾多圖像處理模塊集成在一起的軟件開發包(Software Development Kit,SDK),其自身并不復雜,只要通過學習都可以輕松掌握其使用方式。
4. OpenCV相關學習網站
- ? 官方網站
- ??中文網站
- ??github
- ??OpenCV教程
- opencv中文教程
參考資料:
1.?OpenCV各版本差異與演化,從1.x到4.0?
總結
以上是生活随笔為你收集整理的Opencv学习笔记之OpenCV介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt学习笔记之网络和连接
- 下一篇: Qt使用OpenCV读取图片练习