本人做项目需要处理摄像头之间白平衡问题,先是利用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深浅拷贝造成运算时间这么大的差异?