- 學習OpenCV 4:基于Python的算法實戰
- 肖鈴
- 1335字
- 2022-05-05 19:40:11
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所示。

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

因此,m2 type的輸出結果為數值0。
圖像矩陣m3的顯示結果如圖3.2所示,由于其像素初值為128,所以為灰色。

圖3.2
Mat的構造函數有眾多的重載函數,讀者可以選取合適的方式構造。讀取圖像后,可以調用成員函數或成員變量獲取圖像的信息。
如下案例代碼用于讀取本地圖像文件,獲取圖像中的元素總量,圖像的寬(cols,列數)、高(rows,行數)、通道數、深度:

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

圖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所示。

圖3.4

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

在以上代碼中,首先創建Mat對象m7;然后調用resize函數,將m5圖像矩陣調整尺寸后存入m7中,調整后的m7圖像的尺寸為m5尺寸的1/2。resize函數執行后的結果如圖3.6所示。
有時需要對圖像矩陣中的元素進行操作,Mat類對象可以執行圖像元素的訪問操作:


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

圖3.6

圖3.7
- Learn TypeScript 3 by Building Web Applications
- Learning C# by Developing Games with Unity 2020
- 機器學習系統:設計和實現
- SpringMVC+MyBatis快速開發與項目實戰
- PostgreSQL 11從入門到精通(視頻教學版)
- JavaScript 程序設計案例教程
- The HTML and CSS Workshop
- 深入理解Elasticsearch(原書第3版)
- Express Web Application Development
- 算法圖解
- Arduino機器人系統設計及開發
- Laravel Design Patterns and Best Practices
- MongoDB Administrator’s Guide
- Unity 5 Game Optimization
- Scratch超人漫游記:創意程序設計:STEAM創新教育指南