轉載文章,地址聲明在文章末尾!html
當咱們安裝完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文件夾中,以下,框架
.dom
首先,doc文件夾下放的是各類關於opencv的文檔;include文件夾下是全部的頭文件;其他四個分別是:一個給java用的庫、一個給python用、一個給x86win用、一個給x64win用。兩個cmake文件都是cmake的一些配置,很強大的編譯工具。
分爲opencv和opencv2.
.
一、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"
cv.hpp中包含頭文件:
#include <cv.h>
也就是說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"
很明顯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
其解釋以下:
【calib3d】:其實就是就是Calibration(校準)加3D這兩個詞的組合縮寫。這個模塊主要是相機校準和三維重建相關的內容。基本的多視角幾何算法,單個立體攝像頭標定,物體姿態估計,立體類似性算法,3D信息的重建等等。
【contrib】:也就是Contributed/Experimental Stuf的縮寫, 該模塊包含了一些最近添加的不太穩定的可選功能,不用去多管。2.4.8以後有新型人臉識別, 立體匹配 ,人工視網膜模型等技術。
【core】: 核心功能模塊,尤爲是底層數據結構和算法函數。包含以下內容:
【imgproc】: Image和Processing這兩個單詞的縮寫組合。圖像處理模塊,這個模塊包含了以下內容:
【features2】: d也就是Features2D, 2D功能框架 ,包含興趣點檢測子、描述子以及興趣點匹配框架。包含以下內容:
【flann】: Fast Library for Approximate Nearest Neighbors,高維的近似近鄰快速搜索算法庫, 包含兩個部分:快速近似最近鄰搜索和聚類。
【gpu】: 運用GPU加速的計算機視覺模塊。
【highgui】: 也就是high gui,高層GUI圖形用戶界面,包含媒體的I / O輸入輸出, 視頻捕捉、圖像和視頻的編碼解碼、圖形交互界面的接口等內容。
【legacy】: 一些已經廢棄的代碼庫,保留下來做爲向下兼容,包含以下相關的內容。
【ml】: Machine Learning,機器學習模塊, 基本上是統計模型和分類算法,包含以下內容。
【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,視頻穩定相關的組件。
首先,這裏面放的都是一些庫文件,只不過X64面向64位,X86是32位的,而後以X64爲例,
.
.
這是表明編譯給不一樣版本的visual studio用的庫,這裏以vc12爲例。
.
.
bin文件夾下:dll文件,動態連接庫。具體實現的內容。計算機環境變量中,這個路徑是要加到path中的。
lib文件夾下:配置opencv環境時,添加的lib庫。用來連接。
staticlib文件夾下:靜態庫。
靜態庫是編譯時就把整個函數加載進去,因此可執行文件會變大。動態庫是編譯時加進去的是一個函數表,運行時纔會從dll裏面加載對應的函數實現。
這裏參考於博客給出一個關於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裝載。
。
引用地址: https://blog.csdn.net/liuxiao214/article/details/77882282