OpenCV中构造Mat矩阵赋值和复制的花销

目录

OpenCV中构造Mat矩阵赋值和复制的花销

OpenCV中构造Mat矩阵赋值和复制的花销

对OpenCV中的Mat矩阵的用法一直不太清晰,不了解各种操作的花销,尤其是Mat矩阵结构有智能指针的性质,传递参数时不知道是传对象还是传引用,返回结构不知道是直接返回对象还是要用类似指针的结构。这些问题我还搞不懂,也许没有太大的难度,仔细看一下文档就能明白,就因为我懒,所以看不下去,记性不好,看了也忘。

Mat构造函数种类太多,简单写了一段程序,看看常用的生成Mat矩阵方法的花销有多大。

代码如下:

clock_t t1,t2;

t1 = clock();

Mat mat1(10000,5000,CV_64FC1,Scalar::all(0.0));

t2 = clock();

cout<<"Mat mat1(10000,5000,CV_64FC1,Scalar::all(0.0))\t"<<t2-t1<<endl;



{

t1 = clock();

Mat mat2(mat1);

t2 = clock();

cout<<"Mat mat2(mat1)\t"<<t2-t1<<endl;

}



{

Mat mat3(500,500,CV_64FC1,Scalar::all(0.0));

t1 = clock();

mat3 = mat1;

t2 = clock();

cout<<"mat3 = mat1;\t"<<t2-t1<<endl;

}



{

Mat mat4;

t1 = clock();

mat1.copyTo(mat4);

t2 = clock();

cout<<"mat1.copyTo(mat4);\t"<<t2-t1<<endl;

}



{

Mat mat4;

t1 = clock();

mat4 = mat1.clone();

t2 = clock();

cout<<"mat4 = mat1.clone();\t"<<t2-t1<<endl;

}



{

Mat mat5(10000,5000,CV_32FC1,Scalar::all(0.0));

t1 = clock();

mat1.convertTo(mat5,CV_32FC1);

t2 = clock();

cout<<"mat1.convertTo(mat5,CV_32FC1);\t"<<t2-t1<<endl;

}

一个典型的输出。

Mat mat1(10000,5000,CV_64FC1,Scalar::all(0.0))  540

Mat mat2(mat1)  0

mat3 = mat1;    1

mat1.copyTo(mat4);      515

mat4 = mat1.clone();    465

mat1.convertTo(mat5,CV_32FC1);  488

另一个运行的输出。

Mat mat1(10000,5000,CV_64FC1,Scalar::all(0.0))  391

Mat mat2(mat1)  0

mat3 = mat1;    0

mat1.copyTo(mat4);      433

mat4 = mat1.clone();    453

mat1.convertTo(mat5,CV_32FC1);  495

从结果中可以看到,拷贝构造函数和赋值的时间可以忽略不计,但Mat::copyTo、Mat::clone、Mat::convertTo等需要申请空间或复制数据的操作就需要大量的时间。

应该研究下OpenCV的源代码,加深对Mat类型的认识。