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

OpenCV incompatible with std::vector? (_crtIsValidHeapPointer error)

本文关键字:crtIsValidHeapPointer 错误 不兼容 std vector OpenCV      更新时间:2023-10-16

我在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的一些大罪?

我在使用Visual Studio 2012(版本11)和OpenCV2.4.3时遇到了这个问题,该版本最初仅为2010(版本10)构建。我使用的是版本10的lib和dll。我为2012年构建了它,现在它工作时没有堆损坏错误。

附言:在它之前(当使用版本10构建时),我在opencv函数中使用之前调整了向量的大小。

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

从网上搜索到这些问题,我终于找到了答案。VisionC的答案似乎是正确的,但缺乏一点解释。我想你已经不需要答案了,但这可能对其他人有所帮助。

问题是什么:

我不是专家,但多亏了Michael在这里的回答,据我所知,用于构建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中的项目属性。确保配置被设置为"0";所有配置";。然后,在";配置属性->概述->平台工具集";选择";Visual Studio 2010(v100)";。这应该可以解决问题,将来如果需要,您可以轻松地更改设置。

正如这里所描述的,您仍然需要安装VS 2010(或Windows平台SDK)才能做到这一点。

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

由于OpenCV文档也使用vector<KeyPoint>(在第一个代码块中的readwrite函数中),这不应该是问题的根源。

可能是您在该函数中所做的其他操作导致了错误。

相关文章:
  • 没有找到相关文章