openCV 将 IplImage 与 cv::Mat 混合

2023-11-29

我在使用 opencv 时遇到了一些内存管理的歧义。 您可以使用新的 opencv C++ 类来执行此操作:

cv::Mat theimage = cvLoadImage("rawimage.pgm",CV_LOAD_IMAGE_ANYDEPTH);

现在我不明白如果我执行以下操作我会收到错误:

theimage.deallocate();

也许这是错误的。我做了一些实验,当我释放 Mat 对象时:

theimage.release();

IplImage 对象仍然保留在内存中。有没有办法对 cv::Mat 对象说销毁 IplImage 对象,或者我的第一行代码是错误的(因为我丢失了 IplImage 对象的指针)? 我在互联网上看到了很多人们使用第一行代码的例子。许多人解释了如何转换,但没有人解释内存会发生什么!

问题是我有许多类正在使用 IplImage 对象(我使用它开始了我的项目)。我明白为什么 cv::Mat 比 IplImage 更好。

--EDIT--

在互联网上我找到了以下混合解决方案:

cv::Ptr<IplImage> tmp = cvLoadImage("rawimage.pgm",CV_LOAD_IMAGE_ANYDEPTH);
cv::Mat theimage(tmp);

我认为这可以解决我的一些问题,但使我的代码有点难以阅读,并且在我看来仍然很危险。 如果 tmp 在 cv::Mat 之前被释放,我将使用一些损坏的对象(我没有测试,但我认为确实如此)。最简单的方法是使用副本:

cv::Mat theimage(tmp,true);

这是我找到的唯一解决方案,但对我来说感觉不对......


歧义来自于一种极其可怕的做法:将C接口与OpenCV的C++接口混合。不要这样做,使用cv::imread()反而。

的析构函数cv::Mat 总是会在需要时释放内存, except几时初始化自IplImage, then 由你来释放它的资源deallocate()。我写了一个简单的实验来验证这个信息:

void load()
{
    cv::Mat img = cvLoadImage("out.png", 1);

    std::cout << "* IMG was loaded\n";
    getchar();

    img.deallocate();
}

int main()
{
    load();

    std::cout << "* IMG was deallocated\n";
    getchar();

    return 0;
}

The getchar()调用会暂停程序,以便您可以检查应用程序的内存占用情况。如果你评论出来deallocate()您会注意到加载图像后内存占用量并没有减少。

顺便说一句,Mat::release()仅减少引用计数器并在需要时释放数据(但它也不会释放,以防Mat初始化自IplImage).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openCV 将 IplImage 与 cv::Mat 混合 的相关文章

随机推荐

  • 将 ASP.NET 部署到 Windows Azure 云,应用程序在云上运行时出现错误

    我正在尝试在 Windows Azure 云中部署 ASP NET 应用程序 我正在使用 Google API 进行应用程序中的调用之一 当我这样做时 我收到以下错误 System UnauthorizedAccessException 对
  • CodeIgniter-单击每个链接或重新加载页面时检查会话变量是否已设置

    我有一个名为 admin 的控制器 如果设置了会话变量 则可以使用控制器中的所有功能 那么当单击页面中的每个链接或重新加载页面时 检查会话是否设置的最佳方法是什么 例如 如果我在多个选项卡中打开我的管理主页 浏览器并从第一个选项卡注销 然后
  • Python PPTX条形图负值

    我使用以下代码为 python pptx 生成的条形图指定条形的特定颜色 chart series 0 format fill solid chart series 0 format fill fore color rgb RGBColor
  • 使用 JOLT 转换重命名嵌套数组中的字段

    我想使用 JOLT 转换库重命名嵌套在另一个数组中的数组中的字段 要重命名的一个字段是数组中的顶级字段 要重命名的两个字段位于嵌套数组内 我尝试过使用通配符 但它们没有给我预期的输出 我使用的是 JOLT 0 0 22 版本 输入 JSON
  • 使用 QueryByAttribute 无法检索空值

    我是 CRM 开发新手 除了 CRM 2011 中的现有值之外 我还想从我的 C 应用程序更新自定义字段值 如果该字段有一些值 那么它工作正常 但如果它为空 那么我收到 给定的键不存在于字典中 错误 下面的代码是我想要实现的目标 IOrga
  • 如何使用 bash 删除并替换终端中的最后一行?

    我想在 bash 中实现一个显示经过秒数的进度条 为此 我需要擦除屏幕上显示的最后一行 命令 clear 会擦除所有屏幕 但我只需要擦除进度条的行并将其替换为新信息 最终结果应如下所示 Elapsed time 5 seconds 然后 1
  • 如何诊断 MS 访问崩溃

    我们有一个用 Access 编写的自定义程序 其中有奇怪的崩溃 我们添加了错误处理 记录并通过电子邮件发送我们自己的代码内部发生的任何崩溃 这使我们能够修复生成的大多数错误 但有时崩溃发生在我们的代码外部 我们发现 2013 年新出现的一个
  • Java 中的谓词

    我正在浏览使用的代码Predicate在爪哇 我从来没有用过Predicate 有人可以指导我任何教程或概念解释吗Predicate以及它在Java中的实现 我假设你正在谈论com google common base Predicate
  • 为什么这个 OpenMP 程序比单线程慢?

    请看一下这段代码 单线程程序 http pastebin com KAx4RmSJ 编译为 g lrt O2 main cpp o nnlv2 使用 openMP 的多线程 http pastebin com fbe4gZSn编译为 g l
  • Android:如何从 JAR 文件动态加载类?

    我正在尝试在 Android 平台上运行时动态加载一个类 该类包含在单独的库 JAR 文件中 但与 APK 一起打包 根据 SDK 中的新库机制 使用 Class forname 方法时 我收到类未找到异常 我已经看到了一些关于 DexCl
  • PHP 使用 imagegrabscreen

    我如何使用 imagegrabscreen 获取特定网站的缩略图和全尺寸图像 我在想我可以有一个array我将想要的 uri 输入到其中 但我对如何设置我需要抓取的图像的 wxh 有点困惑 我还认为我需要一个thumbnail class
  • 如何按顺序获取最后 5 个文档?

    说我有1 2 3 4 5 6 7 8 9 10在数据库中 基于timestamp order 我想要得到6 7 8 9 10按顺序 MessageModel find sort timestamp 1 limit 5 exec then m
  • 如何将链表写入文件

    我是一名新程序员 在将链接列表写入文本文件时遇到一些麻烦 这是我的代码 typedef struct N int code char name MAX1 int items float price struct N next node t
  • 在 JavaScript 中解析带有逗号小数点分隔符的数字

    我用这个函数来检查一个值是否是一个数字 function isNumber n return isNaN parseFloat n isFinite n 我的计划需要符合德国价值观 我们使用逗号而不是点作为小数点分隔符 因此该函数不起作用
  • 具有空对象的归约函数不起作用

    我正在尝试从表单元素创建对象 由于某种原因 它抛出了错误 let allInputs formData allInputs pop Remove submit button return allInputs reduce userObj d
  • 方法 string.Replace( ) 不起作用[重复]

    这个问题在这里已经有答案了 public string Generate RandomNumberGenerator rdng new RNGCryptoServiceProvider byte bytes new byte 40 rdng
  • 如何使用 Meteor.js 显示所有登录用户的列表

    几天来我一直在尝试获取 Meteor 聊天应用程序中登录用户的列表 我尝试了很多不同的事情 我设法在用户配置文件对象上添加登录标志 服务器端 Accounts onCreateUser function options user if op
  • 降序数组上的 d3.bisector

    我正在创建一个简单的 D3 折线图 但在使用以下命令创建工具提示时遇到问题d3 bisector 功能 我正在寻找它去 Y 和 X 轴的每个值 bisector 函数可以很好地为我提供与鼠标坐标相对应的 xData 值 但我不断得到 yDa
  • 使用 css 和 js 固定文本区域中的文本

    我正在尝试修复文本区域开头的文本 我现在拥有的是 div div
  • openCV 将 IplImage 与 cv::Mat 混合

    我在使用 opencv 时遇到了一些内存管理的歧义 您可以使用新的 opencv C 类来执行此操作 cv Mat theimage cvLoadImage rawimage pgm CV LOAD IMAGE ANYDEPTH 现在我不明