繁体   English   中英

使用发布库时,OpenCV imread(文件名)在调试模式下失败

[英]OpenCV imread(filename) fails in debug mode when using release libraries

我有一些C++代码,除了 function imread(file)之外, OpenCV一切正常。 它正确地找到了文件并加载了名称,但没有加载任何数据。

Mat pattImage = imread(fileName, 0);

在对 web 进行了一些研究后,我意识到我处于调试模式,但发布的是OpenCV库,而不是调试库。

debug library:    opencv_core231d.lib
release library:  opencv_core231.lib

虽然这是典型的愚蠢错误,但我认为这不应该做任何事情,调试库应该允许OpenCV代码调试,而发布库允许更快地执行代码,但我不明白为什么 imread 失败了。

谁能解释一下OpenCV调试库和发布库之间的区别以及为什么会发生此错误?

它是OpenCV错误吗?

我永远不会厌倦告诉人们Windows的C ++ OpenCV界面有最大的错误

使用C接口编写一个小测试来检查它是否有效( cvLoadImage()等)。

更新 :既然您知道C接口正常工作,您可以转到邮件列表并在那里报告此错误或自己深入了解代码以找出失败的原因。

在发布模式下,您必须在调试模式下使用发布库 - 调试库。 这不是错误。

有这个问题使用Qt(Qt Creator),链接相应库的调试版本修复它。 这可以在项目配置文件(.pro)中自动完成:

QTCreator .pro文件:根据DEBUG / RELEASE设置LIBS路径

使用FORWARD斜杠(/),而不是反斜杠()。 即使在Windows中!

不正确:

cv::imread("C:\example\1.jpg");

正确:

cv::imread("C:/example/1.jpg");

通常,将“Debug”可执行配置与“Release”配置库链接起来是完全合法的(为什么不应该在Debug和Release中将库导出的符号相同)。 除非(由于某些原因)你不希望发生“混合”。 事实证明,opencv开发人员决定不允许这样的混合,并且他们使用特定部分代码执行此类问题(您可以在版本3.4.4第54行的文件cvdef.h中找到)。 这不是C ++接口错误,而是“通缉”行为。 您可以在https://github.com/opencv/opencv/pull/9161上找到更多信息,其中记录了此更改。

您可以通过将 Debug 应用程序的运行时库从 /MDd(多线程 DLL调试)更改为 /MD(多线程 DLL 运行时的常规发行版)来解决此问题。

与正常发布模式相比,您的代码仍将未经优化且更易于调试,但您会丢失一些调试信息(例如 C 运行时内的崩溃)。 您还会丢失一些调试功能,例如调试堆,但如果您不知道那是什么,那么它不会影响您。

要解决此问题,只需将 go 到 Properties>C/C++/Code Generation 并将“Runtime Library”从 /MDd 更改为 /MD。

例如 OpenCV 4.2,

更改项目属性如下:

配置:调试

配置属性->链接器->输入->附加依赖

添加 opencv_world420 d .lib

配置:发布

配置属性->链接器->输入->附加依赖

添加 opencv_world420.lib

然后你会没事的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM