【问题标题】:OpenCV imread(filename) fails in debug mode when using release libraries使用发布库时,OpenCV imread(filename) 在调试模式下失败
【发布时间】:2012-02-25 21:41:15
【问题描述】:

我有一些 C++ 代码,除了函数 imread(file) 之外,所有的东西都可以在 OpenCV 上正常工作。它正确地找到了文件并加载了名称,但没有加载任何数据。

Mat pattImage = imread(fileName, 0);

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

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

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

谁能解释一下OpenCVdebugrelease库的区别以及为什么会出现这个错误?

这是一个 OpenCV 错误吗?

【问题讨论】:

  • 是的,它是 2.3.1。在 Windows 7 上,32 位
  • 我永远不会厌倦告诉人们 OpenCV for Windows 有最奇怪的错误(当您使用 C++ 接口时)。帮自己一个忙,使用 C 接口编写一个小测试来检查它是否有效(cvLoadImage() 等)。
  • 是的,使用 C 接口它确实可以工作,但我仍然想知道它为什么会失败,因为我认为它不应该失败。也许在未来的版本中他们会修复它。无论如何,我还是喜欢修复 opencv 问题...
  • 转载于2.4.8版本。真的很奇怪... O_o 使用调试库工作正常。

标签: c++ opencv image-processing libraries


【解决方案1】:

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

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

要解决此问题,只需转到属性>C/C++/代码生成并将“运行时库”从 /MDd 更改为 /MD。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      不正确:

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

      正确:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 你是怎么做到的?
        【解决方案5】:

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

        QTCreator .pro file: Setting LIBS path depending on DEBUG / RELEASE

        【讨论】:

          【解决方案6】:

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

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

          更新:既然您知道 C 接口可以正常工作,您可以前往邮件列表报告此错误,也可以自己深入研究代码以找出失败的原因。

          【讨论】:

          • 在另一个问题 (stackoverflow.com/q/19206627/575530) 我被引导到 C++ 接口而不是 C 接口,但你的回答让我想知道。你会为 Windows 用户推荐 C 而不是 C++ 接口吗?
          • 没有。 C ++接口很好。问题是一些 OpenCV 安装程序提供了使用特定标志编译的二进制文件,您需要在项目中设置这些文件才能使用 OpenCV 构建应用程序。例如,在 Visual Studio 上,您可能想要转到 Project Properties,选择 C/C++ > Code Generation,并确保运行时库字段设置为“多线程调试(/MTd)”
          • 您如何知道您的库是否不匹配?我已经用 CMAKE_BUILD_TYPE=DEBUG 重建了 opencv。我正在 linux 上的 eclipse 中编译我的测试程序。但 imread 加载的图片无效。
          • 这里报告的问题不适用于 Linux。您是否传递了文件的完整路径(而不是相对路径)?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-19
          • 1970-01-01
          • 1970-01-01
          • 2011-05-21
          • 1970-01-01
          • 2014-02-18
          相关资源
          最近更新 更多