Mat簡介入門

1.圖像基本概念
灰度圖用 2 維矩陣表示,彩色(多通道)圖像用 3 維矩陣(M× N × 3)表示。對於圖像顯示來說,目前大部分設備都是用無符號 8 位整數(類型爲 CV_8U)表示像素亮度。圖像數據在計算機內存中的存儲順序爲以圖像最左上點(也可能是最左下點)開始。
這裏寫圖片描述
Iij 表示第 i 行 j 列的像素值。如果是多通道圖像,比如 RGB 圖像,則每個像素用三個字節表示。在 OpenCV 中,RGB 圖像的通道順序爲 BGR。
2.Mat類

常用構造方法
Mat::Mat()無參數構造方法;
Mat::Mat(int rows, int cols, int type)創建行數爲 rows,列數爲 col,類型爲 type 的圖像;
Mat::Mat(Size size, int type)創建大小爲 size,類型爲 type 的圖像;
Mat::Mat(int rows, int cols, int type, const Scalar& s)25創建行數爲 rows,列數爲 col,類型爲 type 的圖像,並將所有元素初始化爲值 s;
Mat::Mat(Size size, int type, const Scalar& s)創建大小爲 size,類型爲 type 的圖像,並將所有元素初始化爲值 s;
Mat::Mat(const Mat& m)將 m 賦值給新創建的對象,此處不會對圖像數據進行復制,m 和新對象共用圖像數據;
Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)創建行數爲 rows,列數爲 col,類型爲 type 的圖像,此構造函數不創建圖像數據所需內存,而是直接使用 data 所指內存,圖像的行步長由 step指定。
Mat::Mat(const Mat Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)創建大小爲 size,類型爲 type 的圖像,此構造函數不創建圖像數據所需內存,而是直接使用 data 所指內存,圖像的行步長由 step 指定。& m, const Range& rowRange, const Range& colRange)創建的新圖像爲 m 的一部分,具體的範圍由 rowRange 和 colRange 指定,此構造函數也不進行圖像數據的複製操作,新圖像與 m 共用圖像數據;
Mat::Mat(const Mat& m, const Rect& roi)創建的新圖像爲 m 的一部分,具體的範圍 roi 指定,此構造函數也不進行圖像數據的複製操作,新圖像與 m 共用圖像數據。

3.訪問
(1)at函數
這裏寫圖片描述
(2)迭代器
這裏寫圖片描述
(3)指針(邊界檢測)
這裏寫圖片描述
4.Mat內存結構

Mat 是一個類,由兩個數據部分組成:矩陣頭(包含矩陣尺寸,存儲方法,存儲地址等信息)和一個指向存儲所有像素值的矩陣的指針。
矩陣頭的尺寸是常數值,但矩陣本身的尺寸會依圖像的不同而不同,通常比矩陣頭的尺寸大數個數量級。複製矩陣數據往往花費較多時間,因此除非有必要,不要複製大的矩陣。爲了解決矩陣數據的傳遞,OpenCV 使用了引用計數機制。其思路是讓每個Mat 對象有自己的矩陣頭信息,但多個 Mat 對象可以共享同一個矩陣數據。讓矩陣指針指向同一地址而實現這一目的。
很多函數以及很多操作(如函數參數傳值)只複製矩陣頭信息,而不復制矩陣數據。前面提到過,有很多中方法創建 Mat 類。如果 Mat 類自己申請數據空間,那麼該類會多申請 4 個字節,多出的 4 個字節存儲數據被引用的次數。引用次數存儲於數據空間的後面,refcount 指向這個位置。當計數等於 0時,則釋放該空間。

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章