opencv - 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 ; 没有什么好担心的——内存分配和释放都由你负责!
推荐阅读
- python - 根据两列的值添加另一列
- reactjs - 如何配置你为什么用 NextJS 12 渲染
- mysql - mysql查询以查找针对任何类别仅具有单个特定子类别的行(按数据分组)
- go - 阻止 goroutine 执行
- reverse-engineering - 我怎样才能将此反汇编代码反转为c
- javascript - 为什么我会在 nodejs 和 react 中收到 ECONNREFUSED 代理错误?
- .net-core - .Net core wsfederation 认证 wreq 参数
- java - 最新版 jdk17 和 javafx17 的 rt.jar 和 jfxrt.jar 的等效库是什么?
- angular-material - MatDatePicker 在尝试手动编辑日期时抛出错误
- vue.js - Vue - 两个组件的全局变量/公共变量