OpenCV 笔记(01)— OpenCV 概念、整体架构、各模块主要功能
1. OpenCV 概念
圖像處理( Image Processing )是用計算機對圖像進行分析, 以達到所需結果的技術, 又稱影像處理。
圖像處理技術一般包括圖像壓縮, 增強和復原, 匹配、描述和識別 3 個部分。圖像處理一般指數字圖像處理( Digital Image Processing )。其中, 數字圖像是指用工業相機、攝像機、掃描儀等設備經過拍攝得到的一個大的二維數組。該數組的元素稱為像素,其值稱為灰度值。而數字圖像處理是通過計算機對圖像進行去除噪聲、增強、復原、分割、提取特征等處理的方法和技術。
OpenCV 的全稱是 Open Source Computer Vision Library , 直譯就是“開源計算機視覺庫”。取代表開源的單詞“Open”、“Computer ” 的首字母“C” 以及“ Vision ”的首字母“V”,組合命名為 OpenCV 。
OpenCV 是一個基于開源發行的跨平臺計算機視覺庫, 它實現了圖像處理和計算機視覺方面的很多通用算法,已經成為了計算機視覺領域最有力的研究工具之一。
OpenCV 由一系列 C 函數和 C++ 類構成,擁有包括 500 多個 C 函數的跨平臺的中高層 API。 OpenCV 的設計目標是執行速度盡量快, 主要關注實時應用。它采用優化的 C/C++ 代碼編寫,能夠充分利用多核處理器的優勢, 其主要目標是構建一個簡單易用的計算機視覺框架,以幫助開發人員更便捷地設計更復雜的計算機視覺相關
應用程序。
OpenCV 還提供 MLL ( Machine Learning Library ) 機器學習庫。該機器學習庫主要用于統計方面的模式識別和聚類( clustering )。
OpenCV官方主頁:http://opencv.orgOpenCV Github主頁:https://github.com/opencv/opencvOpenCV開發版Wiki主頁:http://code.opencv.org
2. OpenCV 整體架構
在 /usr/local/include/opencv4/opencv2 目錄下,會發現上述文件夾中有個名為 opencv_modules.hpp 的 hpp 文件,里面存放的是OpenCV 中與新模塊構造相關的說明代碼,打開可以發現其定義的是 OpenCV 所有組件的宏,具體如下。
wohu@wohu:/usr/local/include/opencv4/opencv2$ cat opencv_modules.hpp
/** ** File generated automatically, do not modify **** This file defines the list of modules available in current build configuration**
*/// This definition means that OpenCV is built with enabled non-free code.
// For example, patented algorithms for non-profit/non-commercial use only.
/* #undef OPENCV_ENABLE_NONFREE */#define HAVE_OPENCV_CALIB3D
#define HAVE_OPENCV_CORE
#define HAVE_OPENCV_DNN
#define HAVE_OPENCV_FEATURES2D
#define HAVE_OPENCV_FLANN
#define HAVE_OPENCV_GAPI
#define HAVE_OPENCV_HIGHGUI
#define HAVE_OPENCV_IMGCODECS
#define HAVE_OPENCV_IMGPROC
#define HAVE_OPENCV_ML
#define HAVE_OPENCV_OBJDETECT
#define HAVE_OPENCV_PHOTO
#define HAVE_OPENCV_STITCHING
#define HAVE_OPENCV_VIDEO
#define HAVE_OPENCV_VIDEOIOwohu@wohu:/usr/local/include/opencv4/opencv2$
工程文件包含路徑為 /usr/local/include/opencv4 ,該目錄各個模塊文件夾如下:
wohu@wohu:/usr/local/include/opencv4/opencv2$ ls
calib3d features2d highgui.hpp objdetect stitching.hpp
calib3d.hpp features2d.hpp imgcodecs objdetect.hpp video
core flann imgcodecs.hpp opencv.hpp video.hpp
core.hpp flann.hpp imgproc opencv_modules.hpp videoio
cvconfig.h gapi imgproc.hpp photo videoio.hpp
dnn gapi.hpp ml photo.hpp
dnn.hpp highgui ml.hpp stitching
wohu@wohu:/usr/local/include/opencv4/opencv2$
下面就是 OpenCV 的所有模塊, 按照宏定義的順序依次介紹。
2.1 calib3d
Calibration (校準)和 3D 這兩個詞的組合縮寫。這個模塊主要是相機校準和三維重建相關的內容,包括基本的多視角幾何算法、單個立體攝像頭標定、物體姿態估計、立體相似性算法、3D 信息的重建等。
2.2 core
核心功能模塊,包含如卜內容:
OpenCV基本數據結構- 動態數據結構
- 繪圖函數
- 數組操作相關函數
- 輔助功能與系統函數和宏
- 與
OpenGL的互操作
2.4 features2d
人類視覺系統傾向于從給定場景中提取主要特征,然后記住它,這樣便于后續的檢索。為了模仿這一點,人們開
始設計各種特征提取器,用于從給定的圖像中提取出這些特征點。
流行的算法包括尺度不變特征變換(Scale Invariant Feature Transform,簡稱SIFT)、加速魯棒特征(Speeded Up Robust Features,簡稱SURF)和加速分段測試特征(Features From Accelerated Segment Test,簡稱FAST)。
也就是 Features2D , 即 2D 功能框架, 包含如下內容:
- 特征檢測和描述
- 特征檢測器(Feature Detectors) 通用接口
- 描述符提取器(Descriptor Extractors) 通用接口
- 描述符匹配器(Descriptor Matchers ) 通用接口
- 通用描述符(Generic Descriptor) 匹配器通用接口
- 關鍵點繪制函數和匹配功能繪制函數
2.5 flann
Fast Library for Approximate Nearest Neighbors , 高維的近似近鄰快速搜索算法庫,包含以下兩個部分:
- 快速近似最近鄰搜索
- 聚類
2.7 highgui
高層 GUI 圖形用戶界面,可用于處理所有高級用戶界面操作,包含媒體的輸入輸出、視頻捕捉、圖像和視頻的編碼解碼、圖形交互界面的接口等內容。
它有一個等待功能,可以等你按下鍵盤上的一個鍵才進入下一步。還有一個可以檢測鼠標事件的功能,在開發交互式應用程序時非常有用。
2.9 imgproc
Image 和 Process 這兩個單詞的縮寫組合,圖像處理模塊。包含如下內容:
- 線性和非線性的圖像濾波
- 圖像的幾何變換
- 其他圖像轉換
- 直方圖相關
- 結構分析和形狀描述
- 運動分析和對象跟蹤
- 特征檢測
- 目標檢測等內容
可以執行諸如圖像過濾、形態學操作、幾何變換、顏色轉換、圖像繪制、直方圖、形狀分析、運動分析、特征檢測等操作。
2.10 ml
Machine Learning ,機器學習模塊,基本上是統計模型和分類算法,包含如下內容:
- 統計模型( Statistical Models)
- 一般貝葉斯分類器(Normal Bayes Classifier)
- K-近鄰(K-Nearest Neighbors)
- 支持向量機(Support Vector Machines)
- 決策樹(DecisionTrees)
- 提升(Boosting)
- 梯度提高樹(Gradient Boosted Trees)
- 隨機樹(Random Trees)
- 超隨機樹(Extremely randomized trees)
- 期望最大化(Expectation Maximization)
- 神經網絡(Neural Networks)
- MLData
它還有一個名為快速近似最近鄰搜索庫(Fast Approximate Nearest Neighbor Search Library,簡稱 FLANN)的模塊,其中包含用于在大型數據集中進行快速最近鄰搜索的算法。
2.11 objdetect
目標檢測模塊,包含 Cascade Classification (級聯分類)和 Latent SVM 這兩個部分。對象檢測是指檢測給定圖像中對象的位置。此過程與對象類型無關。
如果你設計一個椅子檢測器,它不會告訴你給定圖像中的椅子是高靠背紅色的,還是藍色低靠背的,它只會告訴你椅子的位置。
2.12 photo
Computational Photography ,包含圖像修復和圖像去噪兩部分。計算攝影是指使用先進的圖像處理技術來改善相機捕獲的圖像。
計算攝影并不專注于光學過程和圖像捕捉方法,而是使用軟件來操縱視覺數據。其應用領域包括高動態范圍成像,全景圖像、圖像補光和光場相機等。
2.13 stitching
images stitching ,圖像拼接模塊,包含如下部分:
- 拼接流水線
- 特點尋找和匹配圖像
- 估計旋轉
- 自動校準
- 圖片歪斜
- 接縫估測
- 曝光補償
- 圖片混合
2.14 video
視頻分析包括諸如分析視頻中連續幀之間的運動、跟蹤視頻中的不同目標、創建視頻監控模型等任務。該模塊包括運動估計、背景分離、對象跟蹤等視頻處理相關內容。
2.15 videoio
videoio 模塊可以處理與視頻文件的輸入和輸出相關的所有操作。可以輕松地從網絡攝像頭捕獲視頻,或以多種不同格式讀取視頻文件。甚至可以通過設置諸如每秒幀數、幀大小等屬性來將很多幀保存為視頻文件。
2.16 人臉和對象識別
人臉識別是指識別給定圖像中的人物。這與人臉檢測不同,在人臉檢測中,只需要識別給定圖像中人臉的位置。
如果你想建立一個可以識別相機前面的人的實用的生物識別系統,首先需要運行一個人臉檢測器來識別人臉的位置,然后運行一個單獨的人臉識別器來識別該人是誰。有一個名為 face 的 OpenCV 模塊用于處理人臉識別。
正如我們之前討論的那樣,計算機視覺試圖按照人類感知視覺數據的方式對算法進行建模。因此,在圖像中找到顯著的區域和對象將是有幫助的,這可以幫助我們處理不同的應用,例如目標識別、目標檢測和跟蹤等。一個名為 saliency 的模塊是專門為此目的而設計的。它提供的算法可以檢測靜態圖像和視頻中的顯著區域。
2.17 表面匹配
Kinect 是捕獲深度信息和視覺數據的一個很好的設備例子,它現在能夠識別輸入的3D對象,并將其與數據庫中的模型匹配。如果我們有一個可以識別和定位對象的系統,那么它就可以用于許多不同的應用程序。
一個名為 surface_matching 的模塊包含用于 3D 對象識別的算法,以及使用 3D 特征的姿勢估計算法。
2.18 文本檢測與識別
一個名為 text 的模塊包含處理文本檢測和識別的各種算法。
3. OpenCV 3 新版本改進
在 GitHub 中, 除了存放著正式版 OpenCV 的主倉庫和新增加的 opencv_extra 倉庫以外, OpenCV 3.0 中還添加了一個名為 opencv_contrib 的全新倉庫, 這個新倉庫中有很多讓人興奮的功能:包括臉部識別和文本探測,以及文本識別、新的邊緣檢測器、充滿藝術感的圖像修復、深度地圖處理、新的光流和追蹤算法等。
OpenCV 主倉庫的地址:https://github.com/opencv/opencv
opencv_extra 倉庫地址:https://github.com/opencv/opencv_extra
opencv contrib 倉庫地址:https://github.com/opencv/opencv_contrib
正式版 opencv 與 opencv_contrib 之間的區別如下:
- 兩者都由
OpenCV官方幵發團隊持續集成系統維護, 雖然目前opencv_contrib倉庫中的代碼測試并沒有完成, 很多功能不穩定。 - 主體的
OpenCV在GitHub中由 Itseez 提供,其有著非常穩定的API以及少部分的創新。 opencv_contrib倉庫是大多數實驗性代碼放置的地方,一些API可能會有改變,一直會歡迎廣大開發者們貢獻新的精彩算法。opencv contrib中的這些額外模塊可以在CMake中用OPENCV_EXTRA_MODULES_PATH=/modules傳遞給CMake文件, 和OpenCV3主體中的代碼一起編譯和運行。opencv_contrib的文檔是自動生成的,可以在 http://docs.opencv.org/master/ 中找到,并會在隨后的版本中更加完善。
總結
以上是生活随笔為你收集整理的OpenCV 笔记(01)— OpenCV 概念、整体架构、各模块主要功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国密胺塑料制品行业
- 下一篇: 2022-2028年中国防水橡胶布行业市