OpenCV中构造Mat矩阵赋值和复制的花销
对OpenCV中的Mat矩阵的用法一直不太清晰,不了解各种操作的花销,尤其是Mat矩阵结构有智能指针的性质,传递参数时不知道是传对象还是传引用,返回结构不知道是直接返回对象还是要用类似指针的结构。这些问题我还搞不懂,也许没有太大的难度,仔细看一下文档就能明白,就因为我懒,所以看不下去,记性不好,看了也忘。
Mat构造函数种类太多,简单写了一段程序,看看常用的生成Mat矩阵方法的花销有多大。
代码如下:
[cpp] 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; }[/cpp] 一个典型的输出。 [cpp]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[/cpp] 另一个运行的输出。 [cpp]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[/cpp] 从结果中可以看到,拷贝构造函数和赋值的时间可以忽略不计,但Mat::copyTo、Mat::clone、Mat::convertTo等需要申请空间或复制数据的操作就需要大量的时间。 应该研究下OpenCV的源代码,加深对Mat类型的认识。