求解cv::Mat深浅拷贝后像素操作时间差异大的原因

本人做项目需要处理摄像头之间白平衡问题,先是利用pbo在循环内进行像素拷贝:

int size = w[i] * h[i] * 4;
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo0[i][_dma]);
glReadPixels(x[i], y[i], w[i], h[i], GL_RGBA, GL_UNSIGNED_BYTE, NULL);
GLubyte* ptr = (GLubyte*)glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, size, GL_MAP_READ_BIT);
data = Mat(x.height, x.width, CV_8UC4, ptr);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);

然后,进行白平衡:

Mat_<Vec4b>::iterator it = data.begin<Vec4b>();
Mat_<Vec4b>::iterator itend = data.end<Vec4b>();
(然后for循环进行简单像素操作)

像素拷贝操作大约耗时约0.013秒,白平衡计算约1.192秒。
之后我把像素拷贝的"data = "赋值语句替换成深拷贝:

data = Mat(x.height, x.width, CV_8UC4, ptr).clone();

像素拷贝操作升至0.1秒左右,白平衡计算降至0.025秒左右。
我检查过"data"变量没有变化,我是想在像素拷贝和白平衡两个运算都获得较低值。
有没有老司机给指一下路:为什么cv::Mat深浅拷贝造成运算时间这么大的差异?

多次测量下把,深拷贝时间长了好理解,毕竟要开辟新的空间和赋值数据,但是你白平衡差距这么大有点问题了。
还有,既然都用opencv了,直接用他的api做就是了,不需要写遍历。先用split通道分离出RGBA,然后用mean(B)计算均值b,然后计算每个通道的增益系数,最后每个通道乘上系数,最后再合并4个通道就是了,opencv支持Mat矩阵运算的,不需要遍历的。

深拷贝会在堆区中在开辟一块空间自然会慢。
当然你可以参考以下几篇文章,看看这几种拷贝的效果对比,以及他们的源码。
https://blog.csdn.net/qinchang1/article/details/86749196
https://blog.csdn.net/weixin_30315723/article/details/99800986
https://blog.csdn.net/qq_32095699/article/details/81007162
https://blog.csdn.net/qq_23968185/article/details/51242686
https://blog.csdn.net/qq_32285693/article/details/106937867
https://blog.csdn.net/My_leaf/article/details/75918725