UMat frame,gray;
VideoCapture cap(0);
if(!cap.isOpened())
return -1;
for(i=0;i<10;i++)
{
cap >> frame;
Canny(frame, frame, 0, 50);
imshow("canny", frame);
}
return 0;
这里我的怀疑是,如果循环运行了10次第11行我正在应用canny过滤器,但src和dst是相同的(帧),所以它将是就地操作,所以在每次迭代时,如果内存不足,会发生什么分配和解除分配!!
- 将有9个没有头指向它的内存位置
- 或者在每个循环中,帧矩阵数据所占用的存储器将是解除分配
- 或者在每个循环中,我都必须调用release()来手动解除分配矩阵
当应用canny滤波器时,结果数据会取代旧的矩阵数据吗,或者它会为结果数据分配一组新的内存并指向它,如果是,旧的矩阵会发生什么?
以下行:
UMat frame
不分配任何重要的图像存储器。它只是在堆栈上创建一个标题,其中包含以下内容的空间:
- 行数
- 以及图像中的列
- 图像类型
- 引用计数,以及
- 一个指针,它最终会指向图像的像素,但目前什么都不指向
进入循环时,以下行:
cap >> frame;
将在堆上为图像的像素分配足够的内存,并初始化维度、引用计数,并使数据指针指向分配的图像内存块——显然,它还将填充来自视频源的像素数据。
当您用呼叫Canny时
Canny(frame, frame, 0, 50);
它将看到操作已经到位,并重用包含frame
的同一Mat并重写它。不需要分配,也不需要释放。
第二次和随后的循环,行:
cap >> frame;
将看到已经分配了足够的空间并将来自视频流的数据加载到相同的Mat
中,从而重写先前Canny()
的结果。
当您从末尾的函数返回时,像素数据的堆内存将被释放,标头的堆内存也将被放弃。
TLDR;没有什么可担心的-内存分配和释放由您负责!