Opencv Mat矩阵操作
1.生成矩阵:
Mat image(240, 320, CV8UC3);
第一个参数是rows,该矩阵的行数;第二个参数是cols,该矩阵的列数;第三个参数是该矩阵元素的类型。这句话表示创建一个大小为240×320的矩阵,里面的元素为8位unsigned型,通道数(channel)有3个。
image.create(480, 640, CV8UC3);
分配(或重新分配)image矩阵,把大小设为480×640,类型设为CV8UC3。
Mat A33(3, 3,CV_32F, Scalar(5));
定义并初始化一个3×3的32bit浮点数矩阵,每个元素都设为5。
Mat B33(3, 3,CV_32F);
B33 = Scalar(5);
和上面的作用一样。
Mat C33 =Mat::ones(3, 3, CV32F)*5.0;
ones函数很像MATLAB里的语句。这句的意思是先定义一个3×3的32bit浮点数矩阵,元素全为1,所有元素再乘以5.0。
Mat D33 =Mat::zeros(3, 3, CV32F) + 5.0;
和上面类似,先定义个3×3的32bit浮点数矩阵,元素全为0,再将所有元素加上5.0;
Mat D33 = Mat::eye(4,4,CV_64F);//对角矩阵
double a = CV_PI/3;
Mat A22 = (Mat_(2, 2) << cos(a), -sin(a), sin(a), cos(a));
CV_PI就是圆周率。是创建一个2×2的float矩阵,把后面四个三角函数值分别赋给4个元素。
float B22data[] ={cos(a), -sin(a), sin(a), cos(a)};
Mat B22 = Mat(2, 2, CV32F, B22data).clone();
第一句创建一个普通数组B22data,第二句创建一个2×2的32bit浮点数矩阵,并使用用B22data数组里的值初始化,然后克隆一下赋给B22矩阵。
为什么这里还要克隆一下,不是多此一举吗?不是,因为用一个数组去初始化一个矩阵的话,你会发现这个矩阵引用了数组的内存地址。不克隆的话,上面例程的后果是B22data数组、Mat(2,2…)这个临时变量矩阵、B22矩阵这三把勺子都插在同一个碗里。
randu(image,Scalar(0), Scalar(256));
把image弄成一个符合正太分布的随机数矩阵,rand表示random,u表示uniform;第二个参数是随机数下限,包含该数;第三个参数是随机数上限,不包含该数。
randn(image,Scalar(128), Scalar(10));
高斯分布的随机数矩阵;第二个参数是均值,第三个参数是标差。
矩阵输出:
cout<< "M = " << endl << " " << M<< endl << endl;
2. 赋值运算
Mat A,C; //仅创建了头部
Mat B(A); //复制构造函数
C=A; //复制运算
**注:**赋值运算符和复制构造函数 (构造函数)只复制头,没有数据。
src.copyTo(dst); //把src矩阵中的数据拷贝到dst
src.convertTo(dst, type, scale, shift);
缩放并转换到另外一种数据类型:dst:目的矩阵 type:需要的输出矩阵类型,或者更明确的,是输出矩阵的深度,如果是负值(常用-1)则输出矩阵和输入矩阵类型相同 scale和shift:缩放参数,也可以写为alpha和beta这个命令也等价于下面的转换公式:m(x,y)=saturatecast(α(∗this)(x,y)+β)m(x,y) =saturatecast(α(*this)(x,y)+β)m(x,y)