OpenCV基礎篇之Mat資料結構

2021-12-29 20:52:31 字數 1940 閱讀 7474

/** filename : matobj.cpp

* author : xiahouzuoxin @163.com

* version : v1.0

* date : thu 15 may 2014 09:12:45 pm cst

* brief :

* * copyright (c) micl,ustb

*/#include

#include

#include

using namespace std;

using namespace cv;

int main(void)

mat是opencv最基本的資料結構,mat即矩陣(matrix)的縮寫,mat資料結構主要包含2部分:header和pointer。header中主要包含矩陣的大小,儲存方式,儲存位址等資訊;pointer中儲存指向畫素值的指標。我們在讀取的時候就是將定義為mat型別,其過載的建構函式一大堆,

class cv_exports mat

要了解如何初始化mat結構,就應該了解它的建構函式,比如程式中的第一初始化方式呼叫額就是

mat(int _rows, int _cols, int _type, const scalar& _s);這個建構函式。

iplimage*是c語言操作opencv的資料結構,在當時c操縱opencv的時候,地位等同於mat,opencv為其提供了乙個介面,很方便的直接將iplimage轉化為mat,即使用建構函式

mat(const iplimage* img, bool copydata=false);上面程式中的第二種方法就是使用的這個建構函式。

關於mat資料複製:前面說過mat包括頭和資料指標,當使用mat的建構函式初始化的時候,會將頭和資料指標複製(注意:只是指標複製,指標指向的位址不會複製),若要將資料也複製,則必須使用copyto或clone函式

mat還有幾個常用的成員函式,在之後的文章中將會使用到:

//! returns true iff the matrix data is continuous

// (i.e. when there are no gaps between successive rows).

// similar to cv_is_mat_cont(cvmat->type)

bool iscontinuous() const;

這了解上面的函式作用前,得了解下opencv中儲存畫素的方法,如下,灰度圖(單通道)儲存按行列儲存,

三通道rgb儲存方式如下,每列含有三個通道,

為了加快訪問的速度,opencv往往會在記憶體中將畫素資料連續地儲存成一行,iscontinus()函式的作用就是用於判斷是否連續儲存成一行。儲存成一行有什麼好處呢?給定這行的頭指標p,則只要使用p++操作就能逐個訪問資料。

因此當判斷存放在一行的時候,可以通過資料指標++很容易遍歷影象畫素:

long nrows = m.rows * m.channels(); // channels()也是mat中乙個常用的函式,用於獲取通道數(rgb=3,灰度=1)

long ncols = m.cols;

uchar *p = m.data; // 資料指標

if(m.iscontinuous())

}請注意以上幾個常用的mat成員遍歷和函式:

m.row; // 返回影象行數

m.ncols; // 返回影象列數

m.channels(); //返回通道數

OpenCV基礎篇之Mat資料結構

filename matobj.cpp author xiahouzuoxin 163.com version v1.0 date thu 15 may 2014 09 12 45 pm cst brief include include include using namespace std us...

opencv之基礎篇(關於Mat類的使用)

opencv中常見的與影象操作有關的資料容器有mat,cvmat和iplimage,這三種型別都可以代表和顯示影象,但是,mat型別側重於計算,數學性較高。而cvmat和iplimage型別更側重於 影象 在opencv2.0之前,opencv是完全用c實現的,但是,iplimage型別與cvmat...

OpenCV之Mat類詳解

學習mat矩陣,了解影象的儲存和mat矩陣的使用 2001年opencv剛出來的時候,是基於c語言介面而建。為了在記憶體 memory 中存放影象,當時採用名為 iplimage 的c語言結構體。其中最大的不足要數手動記憶體管理,使用者要為開闢和銷毀記憶體負責。一旦 開始變得越來越龐大,會越來越多地...