OpenCV中矩陣類詳解:Mat

來源:互聯網
上載者:User
轉載自:http://www.xuebuyuan.com/2148247.html
OpenCV中矩陣類詳解之一:Mat
綜述

Mat類可以被看做是opencv中C++版本的矩陣類,替代原來C版本的矩陣結構體CvMat和映像結構體IplImage;

Mat最大的優勢跟STL的相容性很好,有很多類似於STL的操作。但是Mat遠遠強於後者;

Mat是一種高效的資料類型,它對記憶體進行動態管理,不需要之前使用者手動的管理記憶體。

Mat類定義

Mat類定義於core.hpp中,主要包含有兩部分資料:一部分是矩陣頭(matrix header),這部分的大小是固定的,包含矩陣的大小,儲存的方式,矩陣儲存的地址等等;另一個部分是一個指向矩陣包含像素值的指標(data)。Mat類的定義如下:

class CV_EXPORTS Mat{public:    // ... a lot of methods ...    ...    /*! includes several bit-fields:         - the magic signature         - continuity flag         - depth         - number of channels     */    int flags;    //! the array dimensionality, >= 2    int dims;    //! the number of rows and columns or (-1, -1) when the array has more than 2 dimensions    int rows, cols;    //! pointer to the data    uchar* data;    //! pointer to the reference counter;    // when array points to user-allocated data, the pointer is NULL    int* refcount;    // other members    ...};

Mat資料類型

Mat的儲存是逐行儲存的,矩陣中的資料類型包括:Mat_<uchar>對應的是CV_8U,Mat_<uchar>對應的是CV_8U,Mat_<char>對應的是CV_8S,Mat_<int>對應的是CV_32S,Mat_<float>對應的是CV_32F,Mat_<double>對應的是CV_64F,對應的資料深度如下:

• CV_8U - 8-bit unsigned integers ( 0..255 )

• CV_8S - 8-bit signed integers ( -128..127 )

• CV_16U - 16-bit unsigned integers ( 0..65535 )

• CV_16S - 16-bit signed integers ( -32768..32767 )

• CV_32S - 32-bit signed integers ( -2147483648..2147483647 )

• CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )

• CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN ) 建立Mat矩陣

//1.使用建構函式,常見的幾個如下:Mat::Mat();//defaultMat::Mat(int rows, int cols, int type);Mat::Mat(Size size, int type);Mat::Mat(int rows, int cols, int type, const Scalar& s);Mat::Mat(Size size, int type, const Scalar& s);Mat::Mat(const Mat& m);//參數說明://int rows:高//int cols:寬//int type:參見"Mat類型定義"//Size size:矩陣尺寸,注意寬和高的順序:Size(cols, rows)//const Scalar& s:用於初始化矩陣元素的數值//const Mat& m:拷貝m的矩陣頭給新的Mat對象,但是不複製資料。相當於建立了m的一個引用對象//例子1:建立100*90的矩陣,矩陣元素為3通道32位浮點型cv::Mat M(100, 90, CV_32FC3);//例子2:使用一維或多維陣列來初始化矩陣,double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}};cv::Mat M = cv::Mat(3, 3, CV_64F, m);//2.使用create函數:Mat a = create(10, 9, CV_16U);//建立10*9的矩陣,矩陣元素為16位無符號整型//create的一個特殊用法:如果初始化的時候沒有傳入size的參數,或者後面需要改變size的參數,可以使用create來調整// make 7x7 complex matrix filled with 1+3j.cv::Mat M(7,7,CV_32FC2,Scalar(1,3));// and now turn M to 100x60 15-channel 8-bit matrix.// The old content will be deallocated:隱式使用release()釋放M.create(100,60,CV_8UC(15));
合并矩陣
//假設現有需要將n個CvMat類型的矩陣(每個都是1*m的行向量)合并到一個n*m(n行m列)的矩陣中,即:矩陣合并問題。CvMat* vector; //行向量:1*mMat dst;//目標矩陣:n*mMat vectorMat = Mat(vector, true);//將CvMat轉為MatMat tmpMat = M.row(i);//注意:淺拷貝(參見"複製矩陣")vectorMat.copyTo(tmpMat);//注意:深拷貝(此時tmpMat已改變為vectorMat,即:目標矩陣的第i+1行被賦值為vectorMat)//以上為改變目標矩陣的i+1行的值,以此類推即可將n個行向量合并到目標矩陣中。

訪問矩陣元素

//1.at函數M.at<double>(i,j) += 1.f;//set (i,j)-th elementint a = M.at<int>(i,j);//get (i,j)-th element//2.矩陣元素指標(ptr)for(int i = 0; i < M.rows; i++){    const double* pData = M.ptr<double>(i);//第i+1行的所有元素    for(int j = 0; j < M.cols; j++)cout<<pData[j]<<endl;}
Mat類成員函數詳解

Mat::eye

返回一個恒等指定大小和類型矩陣。

C++: static MatExpr Mat::eye(int rows, int cols, inttype)

C++: static MatExpr Mat::eye(Size size, int type)

參數

rows –的行數。

cols– 的列數。

size –替代矩陣大小規格Size(cols, rows)的方法。

type – 建立的矩陣的類型。

該方法返回 Matlab 式恒等矩陣初始值設定項,類似 Mat::zeros()和 Mat::ones(),你可以用縮放操作高效地建立縮放的恒等矩陣:

/ / 建立4 x 4 的對角矩陣並在對角線上以0.1的比率縮小。

Mat A = Mat::eye(4, 4, CV_32F)*0.1; Mat::create

分配新的陣列資料 (如果需要)。

C++: void Mat::create(int rows, int cols, int type)

C++: void Mat::create(Size size, int type)

C++: void Mat::create(int ndims, const int* sizes, inttype)

參數

ndims – 新數組的維數。

rows –新的行數。

cols – 新的列數。

size – 替代新矩陣大小規格:Size(cols, rows)。

sizes – 指定一個新的陣列形狀的整數數組。

type – 新矩陣的類型。

這是關鍵的Mat方法之一。大多數新樣式 OpenCV 函數和產生陣列的方法每個輸出數組都調用這個方法。此方法使用如下演算法:

1.如果當前數組形狀和類型匹配新的請立即返回。否則,通過調用 Mat::release()取值 (Dereference)以前的資料。

2.初始化新矩陣頭。

3.分配新的 total()*elemSize() 個位元組的資料空間。

4.分配新的關聯資料的引用計數並將其設定為 1。

這項計劃使記憶體管理強大高效同時還為使用者減少了額外輸入。這意味著通常不需要顯式分配輸出數組。也就是說,可以不寫成:

Mat color;

...

Mat gray(color.rows, color.cols,color.depth());

cvtColor(color, gray, CV_BGR2GRAY);

而寫成:

Mat color;

...

Mat gray;

cvtColor(color, gray, CV_BGR2GRAY);

因為 cvtColor,與大多數 OpenCV 函數相同,在輸出數組時內部調用Mat::create()。 Mat::addref

計數器參考。

C++: void Mat::addref()

該方法遞增與矩陣資料關聯的引用計數。如果矩陣頭指向外部的資料集(見 Mat::Mat()),則引用計數為 NULL,並且該方法在這種情況下不起作用。通常情況下,為避免記憶體流失,不應顯式調用該方法。它是由該矩陣賦值運算子隱式調用。在支援的它平台上,引用計數器遞增是一個原子操作。因此,對相同的矩陣,在不同的線程非同步作業是安全的。 Mat::release

在必要的情況下,遞減引用計數並釋放該矩陣。

C++: void Mat::release()

該方法遞減與矩陣的資料關聯的引用計數。當引用計數減為0時,矩陣的資料將被釋放,資料和引用計數器指標設定為 NULL。如果矩陣頭指向外部資料集 (見 Mat::Mat()), 引用計數為 NULL,並且該方法在這種情況下無效。

可以手動調用此方法強制矩陣資料釋放。但由於這種方法在解構函式中是自動調用的,或以更改資料指標的其他方法,因此通常不需要調用這個函數。在支援它的平台上,引用計數器遞減並檢查是否為0 是一個原子操作。因此,在不同的線程非同步呼叫相同的矩陣是安全的操作。 Mat::resize

更改矩陣的行數。

C++: void Mat::resize(size_t sz)

C++: void Mat::resize(size_t sz, const Scalar& s)

參數

sz –新的行數。

s –分配給新添加的元素的值。

該方法更改矩陣的行數。如果矩陣重新分配,第一最少(Mat::rows,sz) 行數要保留下來。該方法類比相應的 STL 向量類的方法。 Mat::reserve

保留一定數量的行的空間。

C++: void Mat::reserve(size_t sz)

參數

sz –的行數。

該方法sz行儲存空間。如果矩陣已經有足夠的空間來儲存sz行,沒有任何異常發生。如果矩陣重新分配,保留前(Mat::rows) 行。該方法類比了相應的STL 向量類的方法。 Mat::push_back

將元素添加到矩陣的底部。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.