OpenCV之Mat類使用總結
#前言
Mat 是Opencv中很常用的一個圖像容器類,圖像在計算機中的存儲形式是二進制字節流,其本質的存儲形式如下圖所示;
而一張圖片是由很多像素點組成,單個像素點又會因為圖像格式的不同而不同。例如彩色的RBG或者灰度圖像。而在OpenCV中,則可以抽象成一個順序排列的內存區域,里面保存了圖像的所有像素信息,這里用Mat類封裝了這些圖像的信息,包括圖像大小,類型等等,大大地簡化了我們處理和操作圖像。
#概念
Mat 是一個類,從最早的OpenCV是C語言風格發展到現在的C++風格,它對面向對象的支持更加友好。相比較于之前C結構的IplImage,Mat有更多有優點;
內存的分配與釋放更加安全;
使用Mat可以使代碼更加簡潔;
對于圖像數據的處理更加高效;
Mat基本上是一個包含兩個數據部分的類:矩陣頭(包含矩陣大小,用于存儲的方法,存儲矩陣的地址等信息)和指向包含矩陣的矩陣的指針。像素值(取決于選擇存儲的方法取任何維度)。矩陣頭大小是恒定的,但是矩陣本身的大小可能隨圖像而變化,并且通常大幾個數量級。OpenCV是一個圖像處理庫。它包含大量圖像處理功能。為了解決計算挑戰,大多數時候您最終會使用庫的多個功能。因此,將圖像傳遞給函數是一種常見的做法。我們不應該忘記我們正在討論圖像處理算法,這些算法往往計算量很大。我們要做的最后一件事是通過制作不必要的潛在大圖像副本來進一步降低程序的速度。為解決此問題,OpenCV使用引用計數系統(Reference Counting System)。這個想法是每個Mat對象都有自己的頭,但是矩陣可以通過讓它們的矩陣指針指向同一個地址來共享它們的兩個實例。此外,復制操作符只會將標題和指針復制到大矩陣,而不是數據本身。
#實戰
1 基礎操作
1初始化
//CV_8UC(n), ..., CV_64FC(n) Mat A(5,5,CV_64FC1,1); std::cout << "A= " << endl << " " << A << endl; Mat B(5,5,CV_64FC1,2); std::cout << "B= " << endl << " " << B << endl; Mat C(5,5,CV_64FC3,Scalar(6.0f,7.0f,8.0f)); std::cout << "C= " << endl << " " << C << endl; Mat D = Mat::eye(3,3,CV_64F); std::cout << "D= " << endl << " " << D << endl; Mat E = Mat::ones(3,3,CV_64F); std::cout << "E= " << endl << " " << E << endl; Mat F = Mat::zeros(3,3,CV_64F); std::cout << "F= " << endl << " " << F << endl;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A=
[1, 1, 1, 1, 1;
1, 1, 1, 1, 1;
1, 1, 1, 1, 1;
1, 1, 1, 1, 1;
1, 1, 1, 1, 1]
B=
[2, 2, 2, 2, 2;
2, 2, 2, 2, 2;
2, 2, 2, 2, 2;
2, 2, 2, 2, 2;
2, 2, 2, 2, 2]
C=
[6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8;
6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8;
6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8;
6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8;
6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8]
D=
[1, 0, 0;
0, 1, 0;
0, 0, 1]
E=
[1, 1, 1;
1, 1, 1;
1, 1, 1]
F=
[0, 0, 0;
0, 0, 0;
0, 0, 0]
2 讀取圖片
#include
1
2
3
4
5
6
7
8
9
10
11
12
3 圖像ROI
#include
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#參考:
https://docs.opencv.org/2.4/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.html
https://docs.opencv.org/3.1.0/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56
OpenCV
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。