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

时间:2019-01-02 07:28:58

标签: opencv 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过滤器时,结果数据将替换旧的矩阵数据,还是将为结果数据分配一组新的内存并指向它,如果是的话,旧的矩阵数据会发生什么? / p>

1 个答案:

答案 0 :(得分:1)

以下行:

UMat frame

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

  • 行数,
  • 以及图片中的列
  • 图像类型
  • 参考计数,和
  • 最终将指向图像像素的指针,但暂时不指向任何对象。

在进入循环时,以下行:

cap >> frame; 

将在堆上为图像的像素分配足够的内存,并初始化尺寸,参考计数并使数据指针指向已分配的图像内存块-显然,它还将填充视频源中的像素数据


通过以下方式致电Canny:

Canny(frame, frame, 0, 50);

它将看到该操作就位,并重新使用包含frame的同一Mat并将其覆盖。无需分配,也无需释放。


第二遍及后续遍历循环的行:

cap >> frame; 

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


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


TLDR ;没什么可担心的-内存分配和释放将为您处理!