/** 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語言結構體。其中最大的不足要數手動記憶體管理,使用者要為開闢和銷毀記憶體負責。一旦 開始變得越來越龐大,會越來越多地...