1. 程式人生 > >Opencv學習——Mat矩陣操作

Opencv學習——Mat矩陣操作

Opencv2出現以後影象的操作可以不用再用指標的形式啦,用Mat類矩陣能夠很方便的進行矩陣運算。Mat類包含兩部分:矩陣頭和指向矩陣畫素值的指標。一般複製操作只是複製了矩陣頭和指向矩陣的指標,並不會複製矩陣本身的資料。一些基本操作如下:

Mat A, C;    //只建立了矩陣頭
A = imread(argv[1], CV_LOAD_IMAGE_COLOR);        //建立方法
Mat B(A);    //複製
C = A;        //賦值
感興趣區域ROI操作:
Mat D(A, Rect(10,10,100,100));        //使用矩形區域建立ROI
Mat E = A(Range::all(), Range(1,3));    //使用行列邊界建立
當需要對矩陣資料本身進行復制的時候可以使用clone()和CopyTo()函式:
Mat F = A.clone();
Mat G;
A.copyTo(G);
除了使用Mat對影象進行操作外,也可以對mat進行一般的矩陣操作。建立Mat物件的方式有:

1. Mat() 構造

Mat M(2,2,CV_8UC3, Scalar(0,0,255));
Cout<<"M ="<<endl<<" "<<M<<endl;


2.通過建構函式初始化矩陣
int sz[3] = {2,2,2};
Mat L(3,sz,CV_8UC(1),Scalar::all(0));

3.為已存在的Iplimage指標建立資料頭
Iplimage* img = cvLoadImage("xxx.png",1);
Mat mtx(img);        //iplimage* ->Mat

4.create()函式
M.create(4,4,CV_8UC(2));
Cout<<"M = "<<endl<<" "<<M<<endl<<endl;
5.matlab風格的初始化
Mat E = Mat::eye(4,4,CV_64F);        //單位矩陣
Mat O = Mat::ones(2,2, CV_32F);    //全一矩陣
Mat Z = Mat::zeros(3,3,CV_8UC1);    //零矩陣

6.分散初始化
Mat C = (Mat_<double>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);

7.為存在的Mat物件建立一個新的頭資料並複製
Mat RowClone = C.row(1).clone();

8.隨機數填充
Mat R = Mat(3,2,CV_8UC3);
randu(R, Scalar::all(0),Scalar::all(255));

基本矩陣運算

1. 加法、減法、取負:A+B, A-B, A+Scalar, A-Scalar, Scalar+A, Scalar-A, -A;
2.縮放取值範圍:A*alpha(double型別);
3.矩陣對應元素的乘法和除法:A.mul(B), A/B, alpha/A;
4.矩陣乘法:A*B
5.矩陣轉置:A.t()
6.矩陣求逆和求偽逆:A.inv()
7.矩陣比較運算:A compop B, A compop alpha, alpha compop A。compop可以是>,>=,==,!=,<=,<。若條件成立,則結果矩陣(8U型別)的對應元素被置為255,否則為0
8.矩陣位邏輯運算:A logicop B, A logicop Scalar, Scalar logicop A, ~A, 此處logicop可以是&,|和^。
9.矩陣對應元素的最大值和最小值:min(A,B), min(A,alpha), max(A,B),max(A,alpha)
10.矩陣中元素的絕對值:abs(A)
11.叉積和點積:A.cross(B), A.dot(B)