我有一些C ++代码,除了函数imread(file)
之外,OpenCV的一切都运行良好。它正确找到文件并加载名称,但它没有加载任何数据。
Mat pattImage = imread(fileName, 0);
在对网络进行一些研究后,我意识到我处于调试模式但是发布了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 file: Setting LIBS path depending on DEBUG / RELEASE
使用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上找到更多信息,其中记录了此更改。