简单的OpenCV命令在Debug模式下可以工作,但在Release模式下无法工作。

12

我正在尝试使用CascadeClassifier::load()加载一个训练xml文件,在Debug模式下运行良好,但在Release模式下会出现运行时错误。

我收到的错误信息如下:

Unhandled exception at 0x000007feefbf4938 in Testing.exe: 0xC0000005: Access violation writing location 0x0000000000000027.

我的代码如下:

CascadeClassifier c;
if (!c.load("C:/data/haarcascade_frontalface_alt.xml"))
{
    exit(1);
}

代码在加载行崩溃。为什么会发生这种情况?


1
这是你的全部代码吗?如果是,很可能是OpenCV中的一个bug。如果不是,请删除此行周围的所有代码并尝试定位错误。 - Sam
C++接口对于Windows已经让我头痛不已。尝试使用OpenCV的C接口,准备好庆祝吧。这个问题值得更多的赞。 - karlphillip
7
你是否在将调试版本的OpenCV库链接到你的应用程序的调试版本,并在发布版本的应用程序中链接发布版本的OpenCV库?我可能是错的,但你应该检查一下。 - Patryk
4个回答

9

1
当我在链接器中添加附加依赖项时,我犯了同样的错误。将opencv_world330d.lib更改为opencv_world330.lib后,问题得到解决。 - Sndn
哇,感谢你的帮助。我已经束手无策了将近两个星期,终于这个解决方案拯救了我的一天。 - Poornamith

0
没有猜测为什么你的load行只会在发布版本中导致访问冲突。因此,下一步是使用日志记录、printf或适合您的任何其他方法来检测OpenCV发布二进制文件。这种类型的调试在这种情况下起作用,因为您拥有OpenCV的源代码并且可以使用VS2010重新编译。

0

我认为你的错误在于XML文件的“加载”和项目设置中的“工作目录”。

如果你进入项目的属性窗口,请确保“调试”选项中的“工作目录”是正确的。更改“配置”(在Debug和Release之间),然后你应该能够进行比较。

当你尝试读取不存在的文件时,有时会出现这种错误。使用本地路径时,如果在“错误”的工作目录中,通常会导致它在一个配置中运行而在另一个配置中不运行。

编辑:

那个文件存在并且是正确的XML吗?


我回家后会检查你建议的内容,但是它确实存在且正确。就像我说的,在调试模式下这个程序完美运行,但在发布模式下却不行。 - zebra
是的,但如果你在VS中启动代码,即使在发布模式下,它仍然会查找上述“工作目录”以确定它应该存在的位置。如果这与调试模式不同,并且你在任何地方使用本地路径(这可能是问题所在),那么这可能是你的问题。 - g19fanatic

0

这很奇怪。检查您的调试和发布版本选项,确保您正在使用正确版本的库。

我尝试在我的一个项目上运行代码,在调试和发布版本下都可以正常工作,使用的是opencv 2.3.1

尝试将这些代码行添加到另一个已经使用opencv的发布版本工作的项目中。如果它可以工作,那么问题就在于配置设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接