OpenCV-C++ Mat對象的使用


這一篇文章中主要介紹有關Mat類的使用,主要包括:

  • 通過構造函數定義Mat對象;
  • Mat對象常用屬性以及方法
  • 創建一個空白圖像並進行賦值
  • 創建一個小數組

通過構造函數定義Mat對象

Mat中提供了很多的構造函數,這里使用兩種方式:

Mat(Size size, int type);
Mat(int rows, int cols, int type, const Scalar& s);

第一種方式的示例如下:

// 1. 通過構造函數定義Mat對象
Mat dst = Mat(Size(512, 512), CV_8UC3); // 創建Mat對象
dst = Scalar(127, 0, 255); // 填充值

// 顯示圖像
namedWindow("dst image", WINDOW_AUTOSIZE);
imshow("dst image", dst);
waitKey(0);

結果如下圖所示:

當然,其中構造函數的兩個參數也可以來自已有Mat對象,如:

Mat dst = Mat(src.size(), src.type());

第二種使用構造函數定義Mat對象的示例如下:

// 2. 通過構造函數定義Mat對象
Mat dst = Mat(128, 128, CV_8UC3, Scalar(0, 0, 255));

Mat對象常用屬性以及方法

  1. 展示以下Mat對象常用的屬性:
// 1. 通過構造函數定義Mat對象
Mat dst = Mat(Size(512, 512), CV_8UC3); // 創建Mat對象
dst = Scalar(127, 0, 255); // 填充值

// 3. Mat對象常用屬性
int rows = dst.rows;  // 獲取矩陣行
int cols = dst.cols;	// 獲取矩陣列
int dims = dst.dims;	// 獲取矩陣維度
printf("rows: %d, cols: %d, dims: %d\n", rows, cols, dims);

輸出:

rows: 128, cols: 128, dims: 2

需要注意的是,OpenCV中維度dims與通道channels是兩個不同概念:

  • 維度dims表示矩陣的維度,如上面示例是\(128\times 128\)大小的矩陣,它的維度是2;

  • 通過channels表示矩陣中每個元素有幾個值,這個示例是3個值,通道數為3;ix

  1. 演示一些Mat對象常用的方法:
// 4. Mat對象常用方法
int channels = dst.channels();  // 獲取矩陣元素通道數
int depth = dst.depth();  // 獲取每個像素的深度,0: CV_8U, 1: CV_8S,...
bool isEmpty = dst.empty();
printf("channels: %d, depth: %d, isEmpty: %d \n", channels, depth, isEmpty);

輸出:

channels: 3, depth: 0, isEmpty: 0 
  1. 演示一下如何復制Mat對象

分成兩種情況,一種是對原始對象多了一個tmp暫存對象,原始對象改變,tmp對象也改變;另一種是完全構造一個新Mat對象;

第一種,有兩種方式,分別是:使用賦值運算符和使用Mat類復制構造函數;

// 5. 復制Mat對象
// 5.1. tmp對象與原始對象綁定
Mat tmp = src;  // 通過賦值運算符
Mat tmp2(src);  // 通過復制構造函數

第二種,通過Mat::clone()copyTo()方法:獲得一個全新的Mat對象;

// 5.2 獲得一個新的Mat對象
Mat dst1 = src.clone();
Mat dst2;
src.copyTo(dst2);
  1. .prt訪問矩陣元素

獲取圖像第一行的第一個元素:

// 6. prt的使用
const uchar * firstRowElement = src.ptr<uchar>(0);
printf("First Row Element: %d\n", *firstRowElement);
  1. 其他方法
// 7. 其他方法
Mat dstOther1 = Mat::zeros(src.size(), src.type());  // 創建全1矩陣
Mat dstOther2 = Mat::ones(src.size(), src.type());  // 創建零矩陣
Mat dstOther3 = Mat::eye(src.size(), src.type()); // 創建單位矩陣

Mat dstOther4 = Mat:: zeros(2, 2, CV_8UC1);

創建一個空白圖像並進行賦值

  1. 創建一個空白圖像,並進行賦值, 方法如下:
// 8. 創建空白圖像並進行賦值
Mat emptyImage; // 創建Mat對象
emptyImage.create(src.size(), src.type());
emptyImage = Scalar(0, 0, 255);
  1. 創建多維數組

    // 9. 創建多維數組
    int sz[3] = {3, 2, 2}; // 三維矩陣,3x2x2
    Mat dstMultiMat(3, sz, CV_8UC1, Scalar::all(0));
    

表示創建一個三維(\(3\times 2\times 2\))的矩陣,通道數為1,並全部以0填充;

創建小數組

用於創建一些kernel,用於圖像的掩模計算:

// 10. 創建小數組
Mat smallMat = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cout << smallMat << endl;

輸出:

[0, -1, 0;
 -1, 5, -1;
 0, -1, 0]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM