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过滤器时,结果数据将替换旧的矩阵数据,还是将为结果数据分配一组新的内存并指向它,如果是的话,旧的矩阵数据会发生什么? / p>
答案 0 :(得分:1)
以下行:
UMat frame
不分配任何重要的图像内存。它只是在堆栈上创建一个标头,其空间为:
在进入循环时,以下行:
cap >> frame;
将在堆上为图像的像素分配足够的内存,并初始化尺寸,参考计数并使数据指针指向已分配的图像内存块-显然,它还将填充视频源中的像素数据
通过以下方式致电Canny:
Canny(frame, frame, 0, 50);
它将看到该操作就位,并重新使用包含frame
的同一Mat并将其覆盖。无需分配,也无需释放。
第二遍及后续遍历循环的行:
cap >> frame;
将看到已经分配了足够的空间,并将视频流中的数据加载到相同的Mat
中,从而覆盖了前一个Canny()
的结果。
最后从函数返回时,将释放像素数据的堆内存,并放弃标头的堆栈内存。
TLDR ;没什么可担心的-内存分配和释放将为您处理!