OpenCV庫文件介紹

轉載文章,地址聲明在文章末尾!html

 

一、build和source

當咱們安裝完opencv中,你會發如今opencv文件夾中有兩個文件夾,build和source,那它們分別是幹什麼的呢。java

這裏寫圖片描述

首先說這二者的關係,sources放的是opencv中的cpp文件,至關於一個工廠,build放的是opencv中的h、hpp、lib文件,至關於一個工具,opencv的開發者(固然開源後的使用者也能夠)經過sources中的源文件,構建出build中的庫文件,而後使用者就能夠連接這些庫,include<頭文件>。通常非開源的程序和庫是不開放sources的,而opencv做爲一個開源庫,這些也是使用者可見的。python

source裏面是各類各樣的函數實現,對於只想用opencv的人來講,只關心我怎麼用,因而開發者就會使用這些源文件構建出庫,這些庫裏面包含了函數實現。這些庫就是各類lib,而後還有頭文件。算法

build裏面只有接口,沒有cpp中的實現什麼的,build是對使用者的,使用者只用知道接口就好了,不須要知道這個是怎麼作到的。固然由於opencv開源,因此使用者也能夠直接查看源文件。數組

具體來講,soucees裏面放的是函數具體的實現,好比有gray方法,對一個mat的像素怎麼使它變成灰度化。網絡

使用者include<頭文件>,頭文件裏面是各類接口,好比gray,就是一個gray(MAt img),使用者連接這些庫,inluce<頭文件>,而後在程序中調用gray,而後程序運行的時候會進行連接時,在各類依賴庫中尋找gray的實現,由於咱們鏈接了opencv的庫,因此在opencv的lib中就找到了gray的實現,而後就調用這個實現,而後就灰度化了,就是這個麼過程。數據結構

舉個不是很恰當的例子,build就像是賣給用戶的macbook,用戶只用知道怎麼用,這個操做系統很好用,不卡,不用知道這個操做系統怎麼實現了。怎麼實現的就在source裏面,非開源的程序和庫是不可能讓你看到source的。app

二、build

在build文件夾中,以下,框架

這裏寫圖片描述 
.dom

首先,doc文件夾下放的是各類關於opencv的文檔;include文件夾下是全部的頭文件;其他四個分別是:一個給java用的庫、一個給python用、一個給x86win用、一個給x64win用。兩個cmake文件都是cmake的一些配置,很強大的編譯工具。

2.1 include

分爲opencv和opencv2.

這裏寫圖片描述

這裏寫圖片描述 
.

這裏借用博客1博客2的介紹。

一、opencv

其中cv.h中包含的頭文件:

#include "opencv2/core/core_c.h"
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/flann/flann.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/legacy/compat.hpp"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

cv.hpp中包含頭文件:

#include <cv.h>
  • 1

也就是說cv.hpp是包含cv.h的,程序中凡用到cv.h的地方均可以用cv.hpp 替換,那麼爲何又要設置hpp文件呢?

hpp是Header Plus Plus的簡寫,與 .h 文件相似。但與之不一樣的是,.hpp將*.cpp中的實現代碼也寫入其中,使得定義與實現都包含在同一文件中。這樣作帶來的好處顯而易見,無需再將cpp文件添加到項目中編譯,減小了編譯次數,也不用發佈煩人的lib,dll 文件,所以很是適合用來編寫公用的開源庫。

文件夾opencv中的頭文件都是相似的,均包含文件夾opencv2裏的頭文件。因此咱們若是是從低版本的opencv學習過渡到高版本的opencv的話,若是不適應能夠先以opencv文件夾裏的文件調用爲標準。若是熟悉opencv裏的函數分佈,也能夠直接調用opencv2文件夾裏的具體頭文件,這樣在頭文件預編譯提升效率。

二、opencv2

先看opencv.hpp文件:

#include "opencv2/core/core_c.h"
#include "opencv2/core/core.hpp"
#include "opencv2/flann/miniflann.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/photo/photo.hpp"
#include "opencv2/video/video.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/ml/ml.hpp"
#include "opencv2/highgui/highgui_c.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/contrib/contrib.hpp"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

很明顯opencv.hpp的頭文件包含了opencv庫裏的全部頭文件。

接着看opencv_modules.hpp文件:

#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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

其解釋以下:

【calib3d】:其實就是就是Calibration(校準)加3D這兩個詞的組合縮寫。這個模塊主要是相機校準和三維重建相關的內容。基本的多視角幾何算法,單個立體攝像頭標定,物體姿態估計,立體類似性算法,3D信息的重建等等。

【contrib】:也就是Contributed/Experimental Stuf的縮寫, 該模塊包含了一些最近添加的不太穩定的可選功能,不用去多管。2.4.8以後有新型人臉識別, 立體匹配 ,人工視網膜模型等技術。

【core】: 核心功能模塊,尤爲是底層數據結構和算法函數。包含以下內容:

  • OpenCV基本數據結構
  • 動態數據結構
  • 繪圖函數
  • 數組操做相關函數
  • 輔助功能與系統函數和宏

【imgproc】: Image和Processing這兩個單詞的縮寫組合。圖像處理模塊,這個模塊包含了以下內容:

  • 線性和非線性的圖像濾波
  • 圖像的幾何變換
  • 其它(Miscellaneous)圖像轉換
  • 直方圖相關
  • 結構分析和形狀描述
  • 運動分析和對象跟蹤
  • 特徵檢測

【features2】: d也就是Features2D, 2D功能框架 ,包含興趣點檢測子、描述子以及興趣點匹配框架。包含以下內容:

  • 特徵檢測和描述
  • 特徵檢測器(Feature Detectors)通用接口
  • 描述符提取器(Descriptor Extractors)通用接口
  • 描述符匹配器(Descriptor Matchers)通用接口
  • 通用描述符(Generic Descriptor)匹配器通用接口

【flann】: Fast Library for Approximate Nearest Neighbors,高維的近似近鄰快速搜索算法庫, 包含兩個部分:快速近似最近鄰搜索和聚類。

【gpu】: 運用GPU加速的計算機視覺模塊。

【highgui】: 也就是high gui,高層GUI圖形用戶界面,包含媒體的I / O輸入輸出, 視頻捕捉、圖像和視頻的編碼解碼、圖形交互界面的接口等內容。

【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】: 也就是一些具備專利的算法模塊 ,包含特徵檢測和GPU相關的內容。最好不要商用,可能會被告哦。

【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,視頻穩定相關的組件。

2.2 X64和X86

首先,這裏面放的都是一些庫文件,只不過X64面向64位,X86是32位的,而後以X64爲例,


這裏寫圖片描述 
.

這是表明編譯給不一樣版本的visual studio用的庫,這裏以vc12爲例。


這裏寫圖片描述 
.

bin文件夾下:dll文件,動態連接庫。具體實現的內容。計算機環境變量中,這個路徑是要加到path中的。

lib文件夾下:配置opencv環境時,添加的lib庫。用來連接。

staticlib文件夾下:靜態庫。

靜態庫是編譯時就把整個函數加載進去,因此可執行文件會變大。動態庫是編譯時加進去的是一個函數表,運行時纔會從dll裏面加載對應的函數實現。

這裏參考於博客給出一個關於dll和lib的解釋。

共有兩種庫:

  • 一種是LIB包含了函數所在的DLL文件和文件中函數位置的信息(入口),代碼由運行時加載在進程空間中的DLL提供,稱爲動態連接庫dynamic link library。
  • 一種是LIB包含函數代碼自己,在編譯時直接將代碼加入程序當中,稱爲靜態連接庫static link library。

共有兩種連接方式:

  • 動態連接使用動態連接庫,容許可執行模塊(.dll文件或.exe文件)僅包含在運行時定位DLL函數的可執行代碼所需的信息。
  • 靜態連接使用靜態連接庫,連接器從靜態連接庫LIB獲取全部被引用函數,並將庫同代碼一塊兒放到可執行文件中。

關於lib和dll的區別以下:

  • lib是編譯時用到的,dll是運行時用到的。若是要完成源代碼的編譯,只須要lib;若是要使動態連接的程序運行起來,只須要dll。

  • 若是有dll文件,那麼lib通常是一些索引信息,記錄了dll中函數的入口和位置,dll中是函數的具體內容;若是隻有lib文件,那麼這個lib文件是靜態編譯出來的,索引和實現都在其中。使用靜態編譯的lib文件,在運行程序時不須要再掛動態庫,缺點是致使應用程序比較大,並且失去了動態庫的靈活性,發佈新版本時要發佈新的應用程序才行。

  • 動態連接的狀況下,有兩個文件:一個是LIB文件,一個是DLL文件。LIB包含被DLL導出的函數名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件連接到DLL文件。在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中相應函數代碼的地址,從而節省了內存資源。DLL和LIB文件必須隨應用程序一塊兒發行,不然應用程序會產生錯誤。若是不想用lib文件或者沒有lib文件,能夠用WIN32 API函數LoadLibrary、GetProcAddress裝載。

三、sources

這裏寫圖片描述 

  • samples:是一些簡短的學習用例。
  • modules:包含了全部的源文件。
  • doc:是一些文檔,包含一些教程。
  • include:是全部的頭文件。包含opencv和opencv2。
  • 3rdparty:第三方庫,如ffmpeg視頻編碼等。
  • apps:一些應用,好比級聯分類器,haar特徵分類器。
  • cmake:編譯相關。
  • data:級聯分類器的一些數據。好比人臉檢測、人眼檢測等。
  • platform:平臺相關,iOS、Android、Linux、script、win。

引用地址: https://blog.csdn.net/liuxiao214/article/details/77882282

相關文章
相關標籤/搜索