OpenCV3學習筆記(3) 認識Mat類及其建立

2021-10-23 17:44:47 字數 3995 閱讀 4757

早期的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...