(基于OPENCV3.1)Mat 对象的初始化

Mat 是基本的图像容器。    Mat 对象初始化,在使用opencv的过程中,不可避免。不同的初始化方法适应不同的情况。

1.构造函数初始化
如Mat M(2,2,CV_8UC3,Scalar(0,0,255))
Mat(int row,int col,int type,const Scalar &s)
参数依次为,矩阵行数、列数、数据类型、初始化的数值。此处初始化为一个2行2列矩阵。数据类型为CV_8UC3  8位无符号三通道数据,每个数据初始化为0,0,255
2.使用creat函数
M.creat(4,4,CV_8UC(2));
Mat.create(int row,int col,int type)
这个方法不能初始化矩阵内容,如图 所有数值被自动初始化为205.

CV_8UC(2) 括号里的内容设置了图像的通道。
行列是可以用size替代的。
3.创建MATLAB风格的eye、ones、zero 矩阵;
    Mat E = Mat::eye(4, 4, CV_64F);
    cout << "E = "  << " " << E << endl << endl;
        Mat O = Mat::ones(2, 2, CV_32F);
        cout << "O = " << " " << O << endl << endl;
        Mat Z = Mat::zeros(3,3, CV_8UC1);
        cout << "Z = "  << " " << Z << endl << endl;
结果如图


4创建一个3*3的双精度单位矩阵
Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
结果如图。

这个是不是不是单位矩阵,我也不太懂欸。

5 复制。
  Mat RowClone = C.row(1).clone();
RowClone是C的第二行的复制。对RowClone的改动不会影响C;
如图;


6.用随机值填充矩阵
上面的有些方法矩阵的值是默认填充的。
Mat R = Mat(3, 2, CV_8UC3);
randu(R, Scalar::all(0), Scalar::all(255));
随机填充的效果如图:

7.
  vector<float> v;
    v.push_back( (float)CV_PI);   v.push_back(2);    v.push_back(3.01f);
    cout << "Vector of floats via Mat = " << Mat(v) << endl << endl;
结果如图

8.当然还有imread函数
 Mat m = imread("1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
两个参数依次为图片路径,图片的读入方式,默认是三通道的(及时原图是单通道的)。

在 Mat 对象赋值及拷贝构造函数中,只拷贝矩阵头和矩阵指针,不拷贝矩阵本身,这样可以减少很多计算量。
Mat a; M b(a). 当修改b时a会变化。所以使用Mat初始化另一个Mat时要明白使用复制还是引用。

关于Mat的初始化,暂时就这么多吧

猜你喜欢

转载自blog.csdn.net/yijiangyi/article/details/79193410