1. 程式人生 > >OpenCV模組解析與構架圖

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).這些模組

都有一個單獨的標頭檔案(位於include)。

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所有元件的巨集:

  1. /* 
  2.  *     ** File generated automatically, do not modify ** 
  3.  * 
  4.  *This file defines the list of modules available in current build configuration 
  5.  * 
  6.  * 
  7. */
  8. #define HAVE_OPENCV_CALIB3D
  9. #define HAVE_OPENCV_CONTRIB
  10. #define HAVE_OPENCV_CORE
  11. #define HAVE_OPENCV_FEATURES2D
  12. #define HAVE_OPENCV_FLANN
  13. #define HAVE_OPENCV_GPU
  14. #define HAVE_OPENCV_HIGHGUI
  15. #define HAVE_OPENCV_IMGPROC
  16. #define HAVE_OPENCV_LEGACY
  17. #define HAVE_OPENCV_ML
  18. #define HAVE_OPENCV_NONFREE
  19. #define HAVE_OPENCV_OBJDETECT
  20. #define HAVE_OPENCV_OCL
  21. #define HAVE_OPENCV_PHOTO
  22. #define HAVE_OPENCV_STITCHING
  23. #define HAVE_OPENCV_SUPERRES
  24. #define HAVE_OPENCV_TS
  25. #define HAVE_OPENCV_VIDEO
  26. #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