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

问题描述 投票:1回答:4

我无法在向量中获取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的主要罪名?

c++ visual-studio opencv
4个回答
4
投票

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

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


2
投票

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

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

What the problem is:

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

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

对不起,这是如此模糊,但正如我所说,我真的不明白它的来龙去脉。

How to fix it:

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

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

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


2
投票

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


1
投票

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

可能你在该函数中做的其他事情都会导致错误。

© www.soinside.com 2019 - 2024. All rights reserved.