Opencv学习——Mat矩阵操作

xiaoxiao2021-02-28  68

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)

转载请注明原文地址: https://www.6miu.com/read-59282.html

最新回复(0)