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类型的认识。