opencv 3.4.2关于cv::mat的一些问题


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;没有什么可担心的-内存分配和释放由您负责!

相关内容

  • 没有找到相关文章

最新更新