OpenCV模組解析與構架圖
引言
本節主要介紹OpenCV中C語言版(OpenCV2.0以下)和C++語言版(OpenCV2.2以上)各模組功能,以及構架圖。
OpenCV模組
首先,我們介紹1.0至2,2版,OpenCV庫劃分為以下幾個模組。
圖1 OpenCV1.X庫模組
- CV : 主要OpenCV函式,即:核心函式庫
- CVAUX : 輔助函式庫
- CXCORE : 資料結構與線性代數庫(包含CvPoint、CvRect、CvSize、CvMat及lpiImage等常用資料結構);
- HIGHUI : GUI函式庫(使用者互動介面,如影象顯示、接受滑鼠鍵盤事件等。已經包含視訊、攝像頭簡單操作);
- ML : 機器學習函式庫,包含模式分類和迴歸分析等;
- CVCAM :視訊影象處理模組(一般還需要安裝DirectShow。此模組在2.0之後的版本好像不再包含,而直接使用highgui)。
在windows下較低版本(2.0以下)的OpenCV中包含此模組,一般用於處理和操作攝像頭和視訊流的跨平臺模組,在windows下 被封裝成.dll動態連結庫,在Linux中被以so(共享庫,和動態連結庫類似)的形式使用。
然而,自從2.2版開始,OpenCV庫便被劃分為多個模組。這些模組編譯成庫檔案後,位於lib資料夾中。
圖2 OpenCV2.X庫模組
- opencv_core模組,其中包括庫中核心函式結構,特別是基礎的資料結構和算術函式。
- opencv_imgproc
- opencv_highgui模組,包含讀寫影象及視訊的函式,以及操作圖形使用者介面函式。
- opencv_features2d模組,包含興趣點檢測子、描述子以及興趣點匹配框架。
- opencv_calib3d模組,包含相機標定、雙目幾何估算以及立體視覺函式。
- opencv_video模組,包含運動估算、特徵跟蹤以及前景提取函式與類。
- opencv_objdetect模組,包括物體檢測函式,如臉部與行人檢測。
庫中還有其他的工具模組,如機器學習(opencv_ml)、計算幾何(opencv_flann),第三方程式碼 (opencv_contrib),廢棄的程式碼 (opencv_legacy)及GPU加速度過的程式碼 (opencv_gpu).這些模組
OpenCV2.X架構圖
如下圖所示:
開啟 $(OPENCV)\build\include\資料夾(小弟的是D:\OpenCV 2.4.8\opencv\build\include)可以看到:
其中,opencv這個資料夾裡面包含著舊版(C版)的標頭檔案。而opencv2這個資料夾裡面包含著新版(C++版)OpenCV2系列的標頭檔案。
開啟opencv的資料夾,這裡面是opencv 1.0最核心的,而且保留下來的內容的標頭檔案,可以把它們整體理解為一個元件。
開啟opencv2的資料夾,
發現下面有個叫opencv_modules.hpp的hpp檔案,一看就知道里面存放的是opencv2中的新模組構造相關的說明程式碼,開啟一看,果不其然,定義的是OpenCV2所有元件的巨集:
- /*
- * ** File generated automatically, do not modify **
- *
- *This file defines the list of modules available in current build configuration
- *
- *
- */
- #define HAVE_OPENCV_CALIB3D
- #define HAVE_OPENCV_CONTRIB
- #define HAVE_OPENCV_CORE
- #define HAVE_OPENCV_FEATURES2D
- #define HAVE_OPENCV_FLANN
- #define HAVE_OPENCV_GPU
- #define HAVE_OPENCV_HIGHGUI
- #define HAVE_OPENCV_IMGPROC
- #define HAVE_OPENCV_LEGACY
- #define HAVE_OPENCV_ML
- #define HAVE_OPENCV_NONFREE
- #define HAVE_OPENCV_OBJDETECT
- #define HAVE_OPENCV_OCL
- #define HAVE_OPENCV_PHOTO
- #define HAVE_OPENCV_STITCHING
- #define HAVE_OPENCV_SUPERRES
- #define HAVE_OPENCV_TS
- #define HAVE_OPENCV_VIDEO
- #define HAVE_OPENCV_VIDEOSTAB
下面就是OpenCV的所有模組介紹,按照順序來:
【calib3d】——(Camera Calibration and 3D Reconstruction)其實就是就是Calibration(校準)加3D這兩個詞的組合縮寫。這個模組主要是相機校準和三維重建相關的內容。基本的多視角幾何演算法,單個立體攝像頭標定,物體姿態估計,立體相似性演算法,3D資訊的重建等等。,
【contrib】——(Contributed/Experimental Stuff) 該模組包含了一些最近新增的不太穩定的可選功能,不用去多管。2.4.8裡的這個模組有新型人臉識別,立體匹配,人工視網膜模型等技術。
【core】——核心功能模組,包含如下內容:
- 基本結構
- 命令列直譯器
- 基本的C語言的結構和操作
- 動態結構
- 陣列操作
- 繪圖功能
- XML / YAML的永續性
- XML / YAML的永續性(C API)
- 聚類
- 實用和系統函式和巨集
- OpenGL的互操作性
- 英特爾®IPP非同步的C / C + +轉換器
【imgproc】——(Image Processing)。影象處理模組,這個模組包含了如下內容:
- 影象濾波
- 影象的幾何變換
- 各種影象變換
- 直方圖
- 結構分析和形狀描述符
- 運動分析和目標跟蹤
- 特徵檢測
- 目標檢測
【features2d】 ——二維特徵,包含如下內容:
- 特徵檢測和描述
- 特徵檢測器(Feature Detectors)通用介面
- 描述符提取器(Descriptor Extractors)通用介面
- 描述符匹配器(Descriptor Matchers)通用介面
- 通用描述符(Generic Descriptor)匹配器通用介面
- 關鍵點匹配功能繪製函式
- 物件分類
【flann】—— Fast Library for Approximate Nearest Neighbors,聚類分析和多維空間搜尋,包含兩個部分:
- 快速近似最近鄰搜尋
- 聚類
【gpu】——運用GPU加速的計算機視覺模組
【highgui】——(High-level GUI )高層GUI圖形使用者介面,包含媒體的I / O輸入輸出,視訊捕捉、影象和視訊的編碼解碼、圖形互動介面的介面等內容
- 使用者介面
- 讀寫影象視訊
- Qt的新功能
【legacy】—— 一些已經廢棄的程式碼庫,保留下來作為向下相容,包含如下相關的內容:
- 運動分析
- 期望最大化
- 直方圖
- 平面細分(C API)
- 特徵檢測和描述(Feature Detection and Description)
- 描述符提取器(Descriptor Extractors)的通用介面
- 通用描述符(Generic Descriptor Matchers)的常用介面
- 匹配器
【ml】——Machine Learning,機器學習模組, 基本上是統計模型和分類演算法,包含如下內容:
- 統計模型 (Statistical Models)
- 一般貝葉斯分類器 (Normal Bayes Classifier)
- K-近鄰 (K-NearestNeighbors)
- 支援向量機 (Support Vector Machines)
- 決策樹 (Decision Trees)
- 提升(Boosting)
- 梯度提高樹(Gradient Boosted Trees)
- 隨機樹 (Random Trees)
- 超隨機樹 (Extremely randomized trees)
- 期望最大化 (Expectation Maximization)
- 神經網路 (Neural Networks)
- MLData
【nonfree】——也就是一些具有專利的演算法模組 ,包含特徵檢測和描述相關的內容。從名字可知,應該是不能用於商業上的。
【objdetect】——目標檢測模組,包含Cascade Classification(級聯分類)和Latent SVM這兩個部分。
【ocl】——即OpenCL-accelerated Computer Vision,運用OpenCL加速的計算機視覺元件模組
【photo】——也就是Computational Photography,包含影象修復和影象去噪兩部分
【stitching】——images stitching,影象拼接模組,包含如下部分:
- 拼接流水線
- 特點尋找和匹配影象
- 估計旋轉
- 自動校準
- 圖片歪斜
- 接縫估測
- 曝光補償
- 圖片混合
【superres】——SuperResolution,超解析度技術的相關功能模組
【ts】——opencv測試相關程式碼,不用去管他
【video】——視訊分析元件,該模組包括運動估計,背景分離,物件跟蹤等視訊處理相關內容。
【Videostab】——(Video stabilization)視訊穩定相關的元件
- 景區簡介
- 全域性運動估計
- 快速行進法
- OpenCV其實就是這麼多模組組合起來的一個SDK而已。
有一些模組你可能幾乎不會用到它,初始階段常用的是:
cv.hpp、core.hpp、highgui.hpp、imgproc.hpp、opencv.hpp