OpenCV 4.0新特性合集
Summary:一文讀懂OpenCV 4.0 所有新特性
Author:Amusi
Date:2018-11-28
微信公眾號:CVer
github:https://github.com/amusi
文章目錄
- OpenCV 4.0-alpha 新特性
- OpenCV 4.0-beta 新特性
- OpenCV 4.0-rc 新特性
- OpenCV 4.0 正式版新特性
- OpenCV 4.0 更新日誌
- Reference
距離OpenCV 3.0釋出已逾三年半了,終於在2018-11-20,
其實為了打磨OpenCV 4.0正式版,OpenCV曾推出過OpenCV 4.0-alpha和OpenCV 4.0 Beta版本。
OpenCV 4.0-alpha 新特性
https://opencv.org/opencv-4-0-0-alpha.html
OpenCV 4.0 alpha包括3.4分支的所有最新改進,優化和 Bug修復。尤其是:
-
ONNX解析器已新增到OpenCV DNN模組中。它支援各種分類網路,如AlexNet,Inception v2,Resnet,VGG等。還支援 tiny YOLO v2物件檢測網路。
-
其他一些顯著的DNN改進:
- Mask RCNN 支援和示例
- Faster R-CNN:使用Intel Inference Engine(英特爾OpenVINO的一部分)加速
- 基於OpenCL backend的幾個穩定性改進。
-
快速QR碼檢測器(detector)(Core i5 desktop的~80FPS @ 640x480解析度)。官方計劃在OpenCV 4.0正式版中新增QR碼解碼器(decoder),以便有一個完整的解決方案。
-
通過所謂的“wide universal intrinsics”不斷擴充套件SSE4,AVX2和NEON優化核心集。
此外,OpenCV 4.0 alpha包含一些獨有的功能,例如:
-
OpenCV現在是基於C ++ 11庫,它需要符合C ++ 11標準的編譯器。因此,預設情況下可以使用一些很好的功能,例如parallel_for和lambda函式,方便迭代cv :: Mat,初始化cv :: Mat,通過列出它的元素等。
-
標準的std :: string和std :: shared_ptr取代了手工製作的cv :: String和cv :: Ptr。我們的parallel_for現在可以使用std :: threads pool 作為後端。
-
OpenCV 1.x的舊版C API(使用CvMat,IplImage等)被部分排除在外;cleanup 應該主要由OpenCV 4.0 正式版完成。
-
添加了基本的FP(float point)16支援(添加了新的CV_16F型別)。
CPU和GPU加速的KinFu實時三維密集重建演算法已包含在opencv_contrib中。 -
HPX parallel backend(感謝Jakub Golinowski)
-
新的chessboard detector(棋盤探測器)(感謝Alexander Duda)
總的來說,OpenCV 4.0 alpha版本包括85個補丁,包括來自3.4分支的28個大規模合併請求。
OpenCV 4.0-beta 新特性
https://opencv.org/opencv-4-0-0-beta.html
OpenCV 4.0 Beta 包括許多新功能和增強功能。除了這個新的庫,還有新的開源工具OpenVINO™(Open Visual Inference and Neural Network Optimization),可以幫助幫助快速跟蹤高效能運算機視覺開發和深度學習推理。
OpenCV 4.0 Beta包括29個新補丁,包括自OpenCV 4.0 alpha 以來3.4分支的大規模合併:
-
ONNX *(Open Neural Network Exchange)importer 已得到進一步改進,以支援更多擴充套件。
-
OpenCV DNN示例object_detection.py已經改進,可以填寫正確的模型引數,因此現在使用起來要容易得多。
-
G-API(Graph API) - 超高效影象處理 pipeline 引擎已整合為opencv_gapi模組
-
快速QR碼解碼器(decoder),該算是是基於免費的QUirc(https://github.com/dlbeer/quirc)庫,所以現在我們有一個完整的QR碼檢測和解碼實現(執行~20-80FPS @ 640x480解析度)。
-
使用“wide universal intrinsics”為AVX2加速了超過60個核心的18個功能。
-
針對iGPU加速了Kinect Fusion演算法,在高解析度 volume(512x512x512)上實現了並行CPU版本的3倍加速。
OpenCV 4.0-rc 新特性
https://opencv.org/opencv-4-0-0-rc.html
OpenCV 4.0-rc 相比OpenCV 4.0 beta新增了約60個補丁。
-
將實驗中的Vulkan backend新增到DNN模組
-
opencv_stitching模組介面被重構
-
實現了更加精確的相機鏡頭校正演算法
-
核心模組的部分函式(即以XML / YML / JSON格式儲存資料到硬碟)已在C ++中重寫,使得在讀取FileStorage時佔用的記憶體較少。 C語言風格的API(CvFileStorage)已被刪除
-
擴充套件了Graph API模組,使其獲得初始異構支援,OpenCL支援,文件也更加完善,並支援獨立構建它
-
刪除了以下模組的C語言風格API:photo, video, imgcodecs, videoio
-
刪除了videoio 與 highgui 模組中過時的後端支援,包括: QuickTime, QTKit, Unicap, Video for Windows, libv4l, DC1394_V1, Carbon
-shape, superres, videostab, viz 模組和 TVL1 光流演算法被移動到opencv_contrib
-
DIS 光流演算法從opencv_contrib被移動到main repository
-
包含OpenCV 3.4版本的一些最新改進,比如:libpng更新 (安全修復), 支援XCode 10, 支援Turing GPU, 許多優化和Bug 修復
OpenCV 4.0 正式版新特性
https://opencv.org/opencv-4-0-0.html
-
OpenCV現在基於C++ 11庫,需要符合C++ 11 標準的編譯器。所需的最低CMake版本已提升至3.5.1。
-
很多來自OpenCV 1.x的C API已被刪除。
-
在core模組中的部分功能(如在XML,YAML或JSON中儲存和載入結構化資料)已在C++中完全重新實現,並且也刪除了C API。
-
添加了新的模組G-API,它可以作為非常有效的基於圖形的影象處理 pipeline的引擎。
-
dnn模組使用OpenVINO™工具包R4中的Deep Learning Deployment Toolkit進行了更新。請參閱指南如何構建和使用支援DLDT的OpenCV。
-
dnn模組現在包括實驗性Vulkan backend,並支援ONNX格式的網路。
-
Kinect Fusion演算法已針對CPU和GPU(OpenCL)進行實現和優化
-
QR碼檢測器和解碼器已新增到objdetect模組中
-
非常高效且高質量的DIS密集光流演算法已從opencv_contrib轉移到video模組。
OpenCV 4.0 更新日誌
https://github.com/opencv/opencv/wiki/ChangeLog#version400
OpenCV 4.0-alpha:2018年9月
OpenCV 4.0-beta:2018年10月
OpenCV 4.0-final:2018年11月
下面是介紹OpenCV 4.0新特性:
- 刪除大量OpenCV 1.x 遺留的C語言風格的API介面,主要模組是objdetect, photo, video, videoio, imgcodecs, calib3d。
-
在core模組中的部分函式(在XML,YAML或JSON中儲存和載入結構化資料)已用C++ 重新實現,同時刪除了C 風格的API。 目前,base64支援尚未完成(僅支援base64編碼的ML和YAML載入,還不支援編碼)。現在,儲存在FileNode中的序列的隨機訪問是O(N)時間複雜度; 使用cv::FileNodeIterator可以更快地順序訪問。另一方面,載入FileStorage比以前少了3-6倍的記憶體!
-
OpenCV 4.0 現在是基於C++ 11,所以編譯OpenCV時需要支援C++ 11 的編譯器。請注意,通過將-DENABLE_CXX11 = ON標誌傳遞給CMake,OpenCV 3.x也可以構建為C ++ 11庫。 現在這已經變成必選項,因此不需要ON標誌。
- 感謝擴充套件的C++ 11標準庫,我們可以擺脫自己實現的cv::String和cv::Ptr。 現在cv::String == std::string和cv::Ptr是std::shared_ptr之上的thin warpper。 另外,在Linux/BSD for cv :: parallel_for_上,我們現在使用std::thread而不是pthreads。
-
DNN模組的改進:
-
增加Mask-RCNN模型的支援。其使用指南:TensorFlow-Object-Detection-API並參考Python示例
-
整合ONNX解析器(parser)。支援多個主流的分類網路。 支援YOLO 目標檢測網路(YOLO的ONNX版本缺少一些提供矩形列表的卷積層)
-
為了進一步優化DNN模組的效能,引入Intel DLDT。
順便說一下,Intel DLDT 近期已經開源,參考這份指南可知道如何構建和使用帶有DLDT的OpenCV -
API修改:預設情況下,blobFromImage方法不會交換Red和Blue通道,也不會對輸入影象進行裁剪。這個API的修改已經新增到OpenCV 3.4分支。
-
處於實驗中的Vulkan backen已經新增到不支援OpenCL的平臺:https://github.com/opencv/opencv/pull/12703
-
為OpenCV支援的最主流的深度學習網路新增快捷方式(shotcuts)。 你可以指定模型的別名,以跳過預處理引數甚至模型的路徑!比如:
-
python object_detection.py --model opencv_face_detector.caffemodel --config opencv_face_detector.prototxt --mean 104 177 123 --width 300 --height 300
你也可以輸入:
python object_detection.py opencv_fd
- 修復了在AMD和NVIDIA GPUs上的OpenCL加速。 現在你可以為沒有其他環境變數的模型啟用DNN_TARGET_OPENCL。請注意,DNN_TARGET_OPENCL_FP16僅在英特爾GPU上進行測試,因此仍需要額外的標誌
- 添加了全新的opencv_gapi模組。 它是非常有效的影象處理的引擎,基於處理圖的lazy評估和動態構造(因此名稱為Graph API或G-API)。 有關詳細資訊,請參見Graph API(G-API)
-
效能優化
-
OpenCV中的幾百個基本核心已經使用“廣泛通用內在函式(intrinsics)”進行了重寫。這些內在函式對映到SSE2,SSE4,AVX2,NEON或VSX內在函式,具體取決於目標平臺和編譯標誌。它應該轉化為明顯更好的效能,即使對於一些已經優化的功能也是如此。例如,如果使用CPU_BASELINE = AVX2 CMake標誌配置和編譯OpenCV,則可以為某些影象處理操作提供額外15-30%的速度提升。通過OpenCV 4.0 gold,我們計劃將更多核心轉換為此類內在函式,並採用我們的動態排程機制,因此在x64平臺上,AVX2優化核心始終內建,如果實際硬體支援此類指令,則可以在執行中進行選擇(無需更改CPU_BASELINE)。
-
隨著IPPICV元件升級,增加了對IPP 2019的支援
-
- QR 檢測器和解碼器已經與現有的sample一起新增到opencv/objdetect模組中。目前,解碼器構建在QUirc庫之上(我們將這個snapshot放入opencv)
- 主流的Kinect Fusion演算法已經實現,針對CPU和GPU(OpenCL)進行優化,並整合到opencv_contrib/rgbd模組中。 為了使現有sample有效,我們在opencv/videoio模組中更新了Kinect 2支援。在OpenCV 4.0 beta版本中,iGPU的程式碼已經加速,在高解析度的情況下(512x512x512),效能提升了3倍
-
非常高效且高質量的DIS密集光流演算法已經從opencv_contrib轉移到opencv的video 模組。詳見示例
-
同時,較慢的TV L1光流演算法已從opencv轉移到opencv_contrib
Reference
https://opencv.org/releases.html
https://opencv.org/opencv-4-0-0.html
https://opencv.org/opencv-4-0-0-alpha.html