早期的opencv中,影象的處理是通過iplimage的c語言結構。從opencv2.0開始用c++重新實現,引入mat類使用引用計數的方式管理記憶體。
mat類由兩部分組成:矩陣頭(包含矩陣的大小,儲存型別,儲存位址等資訊),以及乙個指向影象實際記憶體區域的指標。矩陣頭大小是恆定的,矩陣資料本身的大小可以隨著影象的不同而變化。mat類使用引用計數系統,每個mat物件都有自己的頭,但是可以指向同乙個記憶體位址,使矩陣資料可以在兩個mat例項之間共享(參照智慧型指標)。使用賦值操作符只會將頭和資料指標複製到另乙個矩陣,而不是資料本身(淺拷貝)。
如下:三者都指向同乙個影象
mat a = imread("f:/src/image.png", cv::imread_unchanged);
mat b(a);
mat c = a;
要想拷貝資料可以通過clone或copyto介面(深拷貝),如下:
mat d = a.clone();
mat e;
a.copyto(e);
(文件:
opencv提供了多個建構函式,目前我初學常用的有預設構造和根據行列進行構造
mat()
mat(int rows, int cols, int type)
mat(size size, int type)
mat(int rows, int cols, int type, const scalar & s)
mat(size size, int type, const scalar & s)
mat(int ndims, const int* sizes, int type)
mat(const std::vector< int > & sizes, int type)
mat(int ndims, const int* sizes, int type, const scalar & s)
mat(const std::vector< int > & sizes, int type, const scalar & s)
mat(const mat & m)
mat(int rows, int cols, int type, void* data, size_t step = auto_step)
mat(size size, int type, void* data, size_t step = auto_step)
mat(int ndims, const int* sizes, int type, void* data, const size_t * steps = 0)
mat(const std::vector< int > & sizes, int type, void* data, const size_t * steps = 0)
mat(const mat & m, const range & rowrange, const range & colrange = range::all())
mat(const mat & m, const rect & roi)
mat(const mat & m, const range * ranges)
mat(const mat & m, const std::vector< range > & ranges)
mat(mat && m)
//等
下面這個構造建立了乙個3*3的四通道純藍圖像,scalar順序一般為bgra:
cv::mat m1(3, 3, cv_8uc4, cv::scalar(255, 0, 0, 255));
std::cout << "m1 = " << std::endl << m1 << std::endl;
//m1 =
//[255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255;
//255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255;
//255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255]
//imshow("test_opencv", m1); //顯示為乙個藍色小點
對於小矩陣,可以使用逗號分隔的初始化器或初始化器列表(在後一種情況下需要c ++ 11支援):
mat mc1 = (mat_(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
std::cout << "mc1=" << std::endl << mc1 << std::endl;
mat mc2 = (mat_ ()).reshape(3);
std::cout << "mc2=" << std::endl << mc2 << std::endl;
//mc1 =
//[0, -1, 0;
//-1, 5, -1;
//0, -1, 0]
//mc2 =
//[0, -1, 0;
//-1, 5, -1;
//0, -1, 0]
void create(int rows, int cols, int type)
void create(size size, int type)
void create(int ndims, const int* sizes, int type)
void create(const std::vector< int > & sizes, int type)
下面建立了乙個3*3的單通道矩陣:
cv::mat m2;
m2.create(3, 3, cv_8uc(1));
eye函式表示的是單位矩陣,ones顧名思義是全是1的矩陣,zeros表示全是0的矩陣:
cv::mat me = cv::mat::eye(4, 4, cv_64f);
std::cout << "me = " << std::endl << me << std::endl;
cv::mat mo = cv::mat::ones(4, 4, cv_64f);
std::cout << "mo = " << std::endl << mo << std::endl;
cv::mat mz = cv::mat::zeros(4, 4, cv_64f);
std::cout << "mz = " << std::endl << mz << std::endl;
//me =
//[1, 0, 0, 0;
//0, 1, 0, 0;
//0, 0, 1, 0;
//0, 0, 0, 1]
//mo =
//[1, 1, 1, 1;
//1, 1, 1, 1;
//1, 1, 1, 1;
//1, 1, 1, 1]
//mz =
//[0, 0, 0, 0;
//0, 0, 0, 0;
//0, 0, 0, 0;
//0, 0, 0, 0]
mat col(int x) const
mat colrange(int startcol, int endcol) const
mat colrange(const range & r) const
mat row(int y) const
mat rowrange(int startrow, int endrow) const
mat rowrange(const range & r) const
mat& cv::mat::adjustroi(int dtop,int dbottom,int dleft,int dright)
mat clone () const cv_nodiscard
(部落格:
(文件:
Opencv3入門學習筆記
最近在學習opencv3,屬於零基礎小白,此篇記錄一些在書中見到的函式,用於後來學習 一 影象的載入與顯示 c mat imread const string filename,intflags 1 flags 0返回乙個3通道的彩色影象 flags 0返回灰度影象。flags 0返回包含alpha...
OpenCV3學習總結
影象處理技術一般包括影象壓縮,增強和復原,匹配 描述和識別3個部分。影象處理和計算機視覺的區別在於 影象處理側重於 處理 影象 如增強 還原 去噪 分割等 而計算機視覺重點在於使用計算機來模擬人的視覺。opencv由一系列c函式和c 類構成,擁有包括500多個c函式的跨平台的中高層api。openc...
opencv3學習筆記(三) core元件
前面已經知道opencv主要由16個元件組成,由於core元件提供了最基本的資料結構,所以就從core元件入手,開始opencv3的研究。從opencv官網上可以看到,core元件主要由以下模組組成 basic structures c structures and operations conne...