Mat类构造与赋值
Mat类的构造
(1)无参数构造
示例:
Mat::Mat();
这种构造方式不需要输入参数,后续给变量赋值时会自动判断矩阵的大小和类型,实现灵活的储存
(2)输入矩阵尺寸和类型构造
示例:
Mat::Mat(int rows,
int cols,
int type)
- rows:构造矩阵的行数
- cols:矩阵的列数
- type:矩阵中储存的数据类型
(3)用Size()结构构造Mat类
示例:
Mat::Mat(Size size(),
int type)
- size:二维数组变量尺寸,通过Size(cols,rows)进行赋值
- type:矩阵中储存的数据类型
示例:
Mat a(Size(480,640),CV_8UC1); //构造一个行为640,列为480的单通道矩阵
Mat b(Size(480,640),CV_32FC3); //构造一个行为640,列为480的3通道矩阵
(4)利用已有矩阵构造Mat
示例:
Mat::Mat(const Mat & m);
- m:已经构建完成的Mat类矩阵数据
(5)构造已有Mat类的子类
示例:
Mat::Mat(const Mat & m,
const Range & rowRange,
const Range & colRange = Range::all()
)
- m:已经构建完成的Mat类矩阵数据
- rowRange:在已有矩阵中需截取的行数,不输入任何值时,表示所有行被截取
- colRange:在已有矩阵中需截取的列数,不输入任何值时,表示所有列被截取
这种方式主要用于原图中截图使用
注意:这种方式构造的Mat子类与父类享有共同的数据,一个类中数据发生变化,另一个随之发生变化
示例:
Mat b(a,Range(2,5),Range(2,5)); //从a中截取部分数据构造b
Mat c(a,Range(2,5)); //默认截取所有列
Mat类的赋值
(1)构造时赋值
Mat::Mat(int rows,
int cols,
int type,
const Scalar & s
)
- rows:构造矩阵的行数
- cols:矩阵的列数
- type:矩阵中储存的数据类型
- s:给矩阵中每一个像素赋值的参数变量,例如Scalar(0,0,255)
示例:
Mat a(2,2,CV_8Uc3,Scalar(0,0,255)); //创建一个3通道矩阵,每一个像素都是0,0,255
Mat b(2,2,CV_8Uc2,Scalar(0,255)); //创建一个2通道矩阵,每一个像素都是0,255
Mat c(2,2,CV_8Uc1,Scalar(255)); //创建一个1通道矩阵,每一个像素都是255
注意:Scalar结构变量个数一定要与定义中的通道数相对应
变量个数大于通道数,则位置在大于通道数之后的数值不会被读取,例:a(2,2,CV_8Uc2,Scalar(0,0,255)); 每一个像素值为(0,0)
变量个数小于通道数,则会以0补充
(2)枚举法赋值
这种方式是将矩阵中每一个元素一一列举,用数据流的形式赋值给Mat类
示例:
Mat a = (Mat_<int>(3,3) << 1,2,3,4,5,6,7,8,9);
Mat b = (Mat_<double>(3,3) << 1.0,2.1,3.2,4.0,5.1,6.2);
注意:用枚举法时,输入数据个数一定要与矩阵元素个数相同
(3)循环法赋值
示例:
Mat c = Mat_<int>(3,3); //创建一个3*3的矩阵
for (int i = 0; i < c.rows;i++) //矩阵行数循环
{
for (int j = 0; j < c.cols; j++) //矩阵列数循环
{
c.at<int>(i,j) = i + j;
}
}
注意:赋值时的变量类型要与矩阵定义的变量类型,即<>内的变量类型要一致
(4)类方法赋值
示例:
Mat a = Mat::eye(3,3,CV_8UC1);
Mat b = (Mat_<int>(1,3) << 1,2,3);
Mat c = Mat::diag(b);
Mat d = Mat::ones(3,3,CV_8UC1);
Mat e = Mat::zeros(4,2,CV_8UC3);
eye():构建一个单位矩阵,前两个参数为矩阵的行数和列数,第3个参数为矩阵存放的数据类型与通道数
如果行数与列数不同,则在矩阵的(1,1),(2,2),(3,3)等主对角位置为1
示例:
>>eye(3,4)
>> 1 0 0 0
0 1 0 0
0 0 1 0
- diag():构建对角矩阵,用来存放对角元素的数值
示例:
>> 8 1 6
3 5 7
4 9 2
>>diag()
>>8
5
2
>> v = [1 1 1];
>> X = diag(v)
X =
1 0 0
0 1 0
0 0 1
>> X = diag(v, 1)
X =
0 1 0 0
0 0 1 0
0 0 0 1
0 0 0 0
- ones():构建一个全为1的矩阵
- zeros():构建一个全为0的矩阵
(5)利用数组进行赋值
float a[8] = {5,6,7,8,9,1,2,3,4};
Mat b = Mat(2,2,CV_32FC2,a);
Mat c = Mat(2,4,CV_32FC1,a);
当矩阵元素数目小于数组的数据时,矩阵赋值完成后,数组剩下数据不再赋值