首页 > 解决方案 > 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 是相同的(帧)所以它将是就地操作,所以在每次迭代中会发生什么内存分配和释放的情况!!

当应用canny过滤器时,结果数据是否会替换旧的矩阵数据,或者它会为结果数据分配一组新的内存并指向它,如果是这样,旧的矩阵数据会发生什么?

标签: opencvmat

解决方案


以下行:

UMat frame

不分配任何重要的图像内存。它只是在堆栈上创建一个带有空间的标题:

  • 行数,
  • 和图像中的列,
  • 图像类型,
  • 引用计数,和
  • 一个指针,最终将指向图像的像素,但目前不指向任何内容。

在进入循环时,以下行:

cap >> frame; 

将在堆上为图像的像素分配足够的内存,并初始化尺寸、引用计数并使数据指针指向分配的图像内存块——显然它也会填充来自视频源的像素数据。


当你打电话给 Canny 时:

Canny(frame, frame, 0, 50);

它将看到操作就地并重新使用包含frame并覆盖它的相同 Mat。不需要分配,也不需要释放。


第二次,也是随后的,你绕过循环,这条线:

cap >> frame; 

将看到已经分配了足够的空间并将视频流中的数据加载到相同的空间中Mat,从而覆盖了先前的结果Canny()


最后从函数返回时,像素数据的堆内存被释放,标题的堆栈内存被放弃。


TLDR ; 没有什么好担心的——内存分配和释放都由你负责!


推荐阅读