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);

当矩阵元素数目小于数组的数据时,矩阵赋值完成后,数组剩下数据不再赋值

results matching ""

    No results matching ""