opencv包含如下幾個模塊,每一個模塊中包含一些共享或者靜態的庫
1.core:核心組件模塊
基礎結構及操做,動態結構,數組操做,繪圖函數、XML/YAML、聚類及實用程序和系統函數宏。
2.Imagpro:圖像處理模塊
包括線性和非線性圖像濾波,幾何圖像變換(調整大小,仿射和透視扭曲,通用的基於表的從新映射),色彩空間轉換,直方圖等的圖像處理模塊。
3.video:視頻分析模塊,包括運動估計,背景減除和對象跟蹤算法。
4.calib3d:基本的多視圖幾何算法,單個和立體相機校準,物體姿態估計,立體聲對應算法和3D重建的元素。
5.features2d:2維特徵框架
特徵檢測與描述,特徵檢測提取匹配接口,關鍵點與匹配點繪圖及對象分類。
6.objdetect:檢測對象和預約義類的實例(例如,面部,眼睛,杯子,人,汽車等)。級聯分類器及SVM。
7.highgui:頂層GUI及視頻I/O
用戶界面,讀/寫圖像及視頻,QT新功能。
cv Namespace
全部OpenCV類和函數都被放置在cv命名空間中。 所以,要從代碼訪問此功能,需使用cv :: specifier或使用命名空間cv;
**我的理解是有了cv能夠調用#include中的方法,二者互相關聯。
1c++
#include "opencv2/core.hpp" ... cv::Mat H = cv::findHomography(points1, points2, CV_RANSAC, 5); ...
2算法
#include "opencv2/core.hpp" using namespace cv; ... Mat H = findHomography(points1, points2, CV_RANSAC, 5 ); ...
爲了防止cv可能與STL或者其餘庫衝突,咱們用第一種方法。
自動內存管理
opencv自動管理內存問題
首先,函數和方法使用的std :: vector,Mat和其餘數據結構具備析構函數,在須要時釋放基礎內存緩衝區。 這意味着在Mat的狀況下,析構函數並不老是釋放緩衝區。 他們考慮到可能的數據共享。 析構函數將與矩陣數據緩衝器相關聯的引用計數器遞減。 當且僅當引用計數器達到0時,即當沒有其餘結構指向相同的緩衝區時,緩衝區被解除分配。 相似地,當Mat實例被複制時,實際數據不會被真正複製。 相反,引用計數器增長以記住擁有相同數據的另外一個全部者。 還有Mat :: clone方法能夠建立矩陣數據的完整副本。 見下面的例子:數組
// create a big 8Mb matrix Mat A(1000, 1000, CV_64F); // create another header for the same matrix; // this is an instant operation, regardless of the matrix size. Mat B = A; // create another header for the 3-rd row of A; no data is copied either Mat C = B.row(3); // now create a separate copy of the matrix Mat D = B.clone(); // copy the 5-th row of B to C, that is, copy the 5-th row of A // to the 3-rd row of A. B.row(5).copyTo(C); // now let A and D share the data; after that the modified version // of A is still referenced by B and C. A = D; // now make B an empty matrix (which references no memory buffers), // but the modified version of A will still be referenced by C, // despite that C is just a single row of the original A B.release(); // finally, make a full copy of C. As a result, the big modified // matrix will be deallocated, since it is not referenced by anyone C = C.clone();
輸出數據的自動分配
*灰度圖像通道數量爲一
限制使用模板數據結構