官术网_书友最值得收藏!

3.2.1 案例11:Mat數據結構介紹及C++調用

Mat數據結構是OpenCV中最重要的數據結構,是OpenCV中圖像最常用的存儲格式。Mat數據結構定義在頭文件"opencv2/core/mat.hpp"中。

如下為Mat類的定義:

此處展示Mat的構造函數,多數情況下使用默認構造函數,構造的矩陣可以被重新分配空間。圖像矩陣可以通過Mat構造函數構造,也可以通過Mat類的成員函數create構建。

如下為Mat構造的模板函數:

如下為Mat類的析構函數:

如下為Mat類重載的賦值運算符:

如下為Mat對象元素操作的函數:

如下為Mat對象變換的一些操作:

生成特定類型的矩陣,如全0矩陣、全1矩陣等:

如下為Mat對象創建函數:

如下為Mat對象的一些操作函數:

如下為返回Mat對象屬性(如矩陣的類型等)的函數:

如下函數返回矩陣指定行的指針:

如下函數返回對指定數組元素的引用:

如下函數完成與Mat矩陣迭代器相關的操作:

如下為Mat對象的成員函數:

如下為標準內存分配器:

Mat類中定義了多種Mat的構造析構方式,還有非常多的圖像矩陣操作,如圖像矩陣元素的增加與刪除,提取子矩陣,獲取圖像矩陣元素類型,獲取圖像矩陣深度、通道數、寬、高、元素數量,判斷圖像矩陣是否為空等。

本案例使用C++語言開發,對Mat對象的構造及一些常見操作做介紹,可以讓讀者對圖像存儲類型Mat有一個清晰的了解,3.2.2節案例將講解Python語言中Mat對象的操作。

使用Mat構造函數創建圖像矩陣的代碼如下:

本案例中選取了常用的3種Mat構造方式來創建圖像矩陣m1、m2、m3。其中,m1調用默認構造函數,創建的圖像矩陣為空;m2創建3×3的矩陣,并指定類型為CV_8U;m3創建512×512的矩陣,指定類型為CV_8U,并初始化初值為128。

執行后的打印信息如圖3.1所示。

img

圖3.1

CV_8U為創建的圖像矩陣的類型,該類型由宏定義,幾個常用的類型定義如下:

因此,m2 type的輸出結果為數值0。

圖像矩陣m3的顯示結果如圖3.2所示,由于其像素初值為128,所以為灰色。

img

圖3.2

Mat的構造函數有眾多的重載函數,讀者可以選取合適的方式構造。讀取圖像后,可以調用成員函數或成員變量獲取圖像的信息。

如下案例代碼用于讀取本地圖像文件,獲取圖像中的元素總量,圖像的寬(cols,列數)、高(rows,行數)、通道數、深度:

執行后的輸出結果如圖3.3所示。

img

圖3.3

如圖3.3所示,總的元素數量為寬和高的乘積,圖像的讀取方式為IMREAD_COLOR,該方式讀取的圖像為3通道的BGR彩色圖像,因此m4的通道數為3。

對于讀取的圖像m4,調用clone()方法,拷貝一份給m5;也可以調用copyTo()方法,將圖像數據拷貝給新的Mat對象:

在上面的案例代碼中,將m4的數據拷貝(clone)一份給m5,然后調用copyTo()方法,將m5的數據拷貝給m6,m6的結果顯示如圖3.4所示。

Mat類的成員函數resize可以改變圖像的行數,代碼如下:

將m6圖像的行數變為原始圖像行數的1/2,變換后的結果如圖3.5所示。

img

圖3.4

img

圖3.5

實際上,很多讀者的需求是調整圖像的寬高尺寸,此時應該調用圖像處理模塊imgproc中的resize函數(第4章會詳細介紹該函數的使用方法),代碼如下:

在以上代碼中,首先創建Mat對象m7;然后調用resize函數,將m5圖像矩陣調整尺寸后存入m7中,調整后的m7圖像的尺寸為m5尺寸的1/2。resize函數執行后的結果如圖3.6所示。

有時需要對圖像矩陣中的元素進行操作,Mat類對象可以執行圖像元素的訪問操作:

在上面的代碼中,創建Mat對象m8并初始化,第一種遍歷方式為按行列遍歷m8并輸出元素值;第二種遍歷方式是獲取每一行的指針,然后使用指針訪問元素。

執行后的打印結果如圖3.7所示。

img

圖3.6

img

圖3.7

主站蜘蛛池模板: 唐山市| 东方市| 黔西| 吐鲁番市| 江陵县| 阜平县| 新乡县| 高碑店市| 龙里县| 务川| 星子县| 水城县| 巴林右旗| 安吉县| 寿宁县| 长武县| 嘉义县| 丰城市| 南部县| 西藏| 遂川县| 彭山县| 子洲县| 囊谦县| 柏乡县| 焉耆| 益阳市| 湘阴县| 隆德县| 泸溪县| 乐陵市| 平陆县| 临夏市| 金昌市| 平武县| 新蔡县| 邵阳县| 林州市| 洛浦县| 龙州县| 西乌珠穆沁旗|