我无法在向量中获取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的主要罪?
答案 0 :(得分:4)
使用Visual Studio 2012(版本11)时,我遇到此问题,OpenCV2.4.3最初仅针对2010(版本10)构建。 我在第10版使用lib和dll。 比我在2012年建立它现在它没有堆损坏错误。
P.S。:在它之前(当使用10版本构建时),我在opencv函数中使用之前调整了向量。
答案 1 :(得分:2)
今天我遇到了这个问题,使用了HoughLinesP函数。
从搜索互联网并查看这些问题,我终于找到了答案。 VisionC的答案似乎在正确的轨道上,但缺乏一些解释。我想你不再需要答案,但这可能对其他人有帮助。
我不是专家,但感谢Michael's answer here,据我所知,用于构建OpenCV的Platform Toolset是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中的项目属性。确保配置设置为“所有配置”。然后,在“Configuration Properties-&gt; General-&gt; Platform Toolset”下选择“Visual Studio 2010(v100)”。这应该可以解决问题,将来您可以根据需要轻松更改设置。
如[{3}}所述,您仍然需要安装VS 2010(或Windows平台SDK)才能执行此操作。
答案 2 :(得分:2)
我在OpenCV3中遇到了同样的问题,我找到了答案。 在我的情况下,我使用从发布版本的Libs而不是调试的问题 你需要确保使用正确的Libs / Dlls 当你在调试时,请确保使用Debug Libs / Dlls。
答案 3 :(得分:1)
由于OpenCV文档也uses vector<KeyPoint>
(在第一个代码块中的read
和write
函数中),这不应该是您的问题的根源。
可能你在该功能中正在做的其他任何事情都会导致错误。