OpenCV 与 std::vector 不兼容? (_crtIsValidHeapPointer 错误)

Posted

技术标签:

【中文标题】OpenCV 与 std::vector 不兼容? (_crtIsValidHeapPointer 错误)【英文标题】:OpenCV incompatible with std::vector? (_crtIsValidHeapPointer error) 【发布时间】:2012-02-02 04:00:03 【问题描述】:

我无法在向量中获取 OpenCV 中的类/结构并使函数保持活动状态而没有任何堆损坏。每当我打开原生 OpenCV 对象的向量时,垃圾回收期间就会出现可怕的 _crtIsValidHeapPointer 错误。

上下文:尝试使用 ORB 比较对象和场景图像中的匹配点。在 C++ 中使用 OpenCV 2.3.1。

代码示例:

vector< KeyPoint > objImageKeypoints;
Mat objImageDescriptors;
OrbFeatureDetector detector = orbFeatureDetector( 1000 );

detector.detect( objImage, objImageKeypoints );

... // There's more, but I've commented out the rest

在我通过了 detect() 方法之后,就没有回头路了。之后,它仍然会给我带来麻烦。

一旦我到达函数的末尾,系统就会崩溃。我是否遗漏了什么,或者我是否使用向量犯了 OpenCV 的一些主要罪行?

【问题讨论】:

我将 IDE 从 VS11 切换到 10 Express,这似乎解决了问题。我将把这归咎于 OpenCV 臭名昭著的糟糕设置,但我会留下这个问题,以防有更好的答案。 我在vs2008中编译了我的opencv源,出现同样的错误如何解决?请帮助 看到这个问题[问题]:***.com/questions/30787348/…也许这就是你的问题 All Configuratins -&gt; General -&gt; Platform Toolset -&gt; Visual Studio 2010 (v100) 为我解决了问题。 【参考方案1】:

我在将 Visual Studio 2012(版本 11)与 OpenCV2.4.3 一起使用时遇到了这个问题,最初仅​​为 2010(版本 10)构建。 我在版本 10 中使用了 lib 和 dll。 比我为 2012 年构建它现在它可以在没有堆损坏错误的情况下工作。

P.S.:在它之前(使用为版本 10 构建时),我在用于 opencv 函数之前调整了向量的大小。

【讨论】:

我已经在vs2008中编译了我的opencv源,出现同样的错误如何解决?请帮助 以上答案是正确的。我不得不在正确的版本下重新安装 opencv Visual Studio,错误(以及许多其他错误)就消失了。【参考方案2】:

我今天遇到了这个问题,使用 HoughLinesP 函数。

通过搜索互联网并查看此类问题,我终于找到了答案。 VisionC 在这里的回答似乎是在正确的轨道上,但缺乏一点解释。我想你不再需要答案了,但这可能对其他人有帮助。

问题是什么:

我不是专家,但感谢Michael's answer here,据我了解,用于构建 OpenCV 的平台工具集是 v100(即 Visual Studio 10 中使用的工具集)。在 Visual Studio 11 (2012) 中,项目默认使用较新的 v110 平台工具集。 (我找不到任何说明新版本的 OpenCV 是否使用 v110。)

似乎正在发生的事情是你给一个 OpenCV 函数(它使用了一些 v100 dll)一个向量,然后函数会修改它。当您的程序(使用 v110 dll)清理矢量时,由于 OpenCV 对其进行了修改,因此存在不兼容问题,从而导致错误。

抱歉,这太含糊了,但正如我所说,我并不真正了解它的来龙去脉。

如何解决:

无论如何,我在这方面找到的答案并没有很好的解决方案。他们会谈论重建 OpenCV 和其他乏味的事情。正如您所发现的,回到 VS2010 可以解决问题,但是必须转换项目并回到旧 IDE 并没有太多乐趣。如果你像我一样使用 C++/CLI,你不会在 VS2010 中获得 IntelliSense。 :(

您需要做的就是转到 VS2012 中的项目属性。确保配置设置为“所有配置”。然后,在“配置属性->常规->平台工具集”下选择“Visual Studio 2010 (v100)”。这应该可以解决问题,并且将来您可以根据需要轻松更改设置。

尽管如 here 所述,您仍然需要安装 VS 2010(或 Windows 平台 SDK)才能执行此操作。

【讨论】:

【参考方案3】:

我在 OpenCV3 中遇到了同样的问题,我找到了答案。 在我的情况下,我使用 Release 中的 Libs 而不是调试的问题 你需要确保使用正确的 Libs/Dlls 当您在调试时,请确保使用调试库/DLL。

【讨论】:

我在 3.1 库中遇到了同样的问题,经过数小时的搜索,我终于找到了解决问题的答案。谢谢!【参考方案4】:

由于 OpenCV 文档还有 uses vector&lt;KeyPoint&gt;(在第一个代码块中的 readwrite 函数中),这不应该是您的问题的根源。

您在该函数中执行的任何其他操作都可能导致错误。

【讨论】:

我已经添加了detector.detect() 行。之后,在示例和代码中,没有其他任何事情发生。其余的我已经注释掉了。仍然爆炸。

以上是关于OpenCV 与 std::vector 不兼容? (_crtIsValidHeapPointer 错误)的主要内容,如果未能解决你的问题,请参考以下文章

传递 opencv inputarray 并将其用作 std::vector

OpenCV cv::Mat 使用 std::vector 导致潜在的内存泄漏

std::vector of OpenCV 点,没有 push_back 方法

在 OpenCV 中 std::vector 而不是 cv::Mat 的 `type` 的解释是啥,我该如何更改它? (C++)

如何处理与派生类不兼容的基类方法?

在opencv中连接向量Rect [重复]