Opencv的Mat型

来源:互联网 发布:阿里云 oss cdn https 编辑:程序博客网 时间:2024/06/06 14:53

Mat由信息头和矩阵内容两部分组成,创建新的Mat分为两种:

1、只创建信息头

Mat A;//只创建了一个信息头

A=imread("a.jpg");// 创建了矩阵内容,开辟了内存

下面两种方式,只复制信息头:

(1).Mat B=A;

(2).Mat B(A);

这里通过任何一个对象改变Mat A也会改变其他对象,也就是他们都指向唯一一个数据矩阵。

当然还有第三种方式,比较特殊,是创建一个感兴趣的区域:

3.Mat C=A(Rect(10,10,100,100));这里(10,10)为起点坐标,(100,100)为宽和高

这里是一一个新的,只引用部分数据的信息头。


2、复制信息头及矩阵内容

(1).Mat D;

  D=imread("d.jpg");

   Mat E;

   D=cotyTo(E);

(2).  Mat D;

    D=imread("d.jpg");

    Mat E;

    E=D.clone();

这种情况下改变复制的矩阵,就不会改变原矩阵了。

个人:做这一部分的时候,我用将a矩阵复制信息头给b矩阵,然后用cvtcolor改变a矩阵,看b矩阵是否改变,发现也改变了。所以我发现cvtcolor不适用于验证这个实验。


创建Mat 的常用方法:

(1).Mat a(2,2,CV_8UC3,scalar(0,0,255));

(2).Mat a=Mat::zeros(2,2,CV_8UC3);   //这里zeros可以换成ones或者eys,但是千万不能用 a.zeros。

对于CV_8UC3的结构:


(3).创建多维Mat 

int main ()
{
int a[2]={2,2};

     
Mat ab(2,a,CV_8UC1,Scalar::all(0));

       //2是维数,数组中(2,2)是每个维数的长度
cout<<ab<<endl;
}


(4)随机填充Mat

Mat ab;

randu(ab,Scalar::all(0),Scalar::all(255)); 


(5)  Point2f  a(1,2);

       vector<Point2f> b;

       cout<<Mat(b);

    Mat可以存储vector ,vector可以存储Point




0 0