【问题标题】:cv::imwrite could not find a writer for the specified extensioncv::imwrite 找不到指定扩展的写入器
【发布时间】:2012-04-09 18:28:39
【问题描述】:

以下命令导致异常。

cv::imwrite("test.jpg", diffImg);

我还尝试了许多变体,包括绝对路径和 PNG 导出。这是错误:

0x75abd36f 处的异常,代码:0xe06d7363:C++ 异常,标志=0x1 (无法继续执行)在 opencv_core231!cv::error

C:\slave\WinInstallerMegaPack\src\opencv\modules\highgui\src\loadsave.cpp:276: 错误:(-2) 找不到指定扩展的编写器

根据this related thread,我当前的 OpenCV 安装不支持我尝试过的图像格式。但我只是像他们的网站建议的那样下载了precompiled Windows framework

如何让 JPG 导出正常工作?

【问题讨论】:

  • 你下载OpenCV-2.3.1-win-superpack.exe了吗?您使用的是什么 Windows? 7 还是 8?
  • 我在我的 Windows 7 电脑上下载了 v2.3.1 超级包。我也试过SVN版本(如下cmets中所示),没有成功。

标签: opencv


【解决方案1】:

您需要重新编译 OpenCV 并添加对“jpeg”格式的支持。 获取最新的opencv代码并运行cmake:

svn co http://code.opencv.org/svn/opencv/trunk/opencv myopencvdir.svn/
cd myopencvdir.svn/
mkdir release
cd release/
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

并检查是否支持 libjpeg、libpng、libtiff。如果没有,您需要安装它们并重新运行 cmake。

显示媒体 I/O 支持的 cmake 输出示例:

--   Media I/O: 
--     ZLib:                       TRUE
--     JPEG:                       TRUE
--     PNG:                        TRUE
--     TIFF:                       TRUE
--     JPEG 2000:                  TRUE
--     OpenEXR:                    YES

【讨论】:

  • 这些是 linux 的命令。您可以使用 cmake 的 gui 界面在 windows 上轻松地做同样的事情。
  • 我按照您的步骤手动编译了 OpenCV。我最终得到的版本是 v2.3.3,它比 Windows 的最新稳定版本 (v2.3.1) 更新。可悲的是,我仍然有同样的问题...这是我的 Media I/O 部分。它说 build 而不是 TRUE 但我认为这不是问题。 pastebin.com/D2LkrWGR
  • 哦,this 也发生在我身上。代码 sn -p here.
【解决方案2】:

在尝试其他任何操作之前,请确保您正在根据this answer 设置 OpenCV 和 VS 项目,并注意不要将 OpenCV 发布库与调试库混用。

您可以尝试以下几种方法:

  • 如果您使用的是 64 位 Windows 7,您可能需要遵循 thisthis 的说明。

  • 我注意到一个类似的question on javacv wiki,这是另一种可能的解决方案:

  1. 前往this page,按照说明设置 opencv 2.3.1 直到第 2 步。(使用 32 位模式)

  2. 下载适用于 Windows from here 的最新版 TBB。

  3. 解压 TBB zip 文件并将 /bin/ia32/vc10 中的所有 .dll 文件和 /bin/ia32/vc10/irml 中的所有 .dll 文件复制到您的 C:\OpenCV 2.3.1\build\ x86\vc10\bin

让我们知道你的表现。

【讨论】:

  • 这适用于我在 Visual Studio 中,但我正在使用带有 MSVC2010 编译器的 Qt Creator IDE。这是我的包含路径和相关的库标志:pastebin.com/jj7damtx 我将 C:\opencv\build\x86\vc10\bin 中的所有 DLL 复制到我正在尝试的程序的目录中建造。文章说将 opencv 目录重命名为 OpenCV 2.3.1 但由于 VS2010 没有这一步就可以工作,我假设它也没有妨碍 Qt Creator .
  • 让您知道我的计算机上所有内容的存储位置,这里是帮助程序创建的环境变量:OPENCV = C:\opencv, PATH = %OPENCV%\build\x86\vc10\bin , LIB = %OPENCV%\build\x86\vc10\lib, 包含 = %OPENCV%\build\include。
【解决方案3】:

听起来好像您使用的执行环境与您正在编译的执行环境不同。你可以试试下面的吗?下载dependency walker 并转到可执行目录并将.exe 文件拖放到dependency walker (http://www.dependencywalker.com/) 上。它将向您显示它正在使用哪些运行时库。 现在,确保您使用正确的环境调用程序。如果可以的话,使用命令行界面来调用程序,它会让你更安全地知道代码是从哪里调用的,这样你就可以确定你复制的 .dll 被调用了。

亲切的问候, 丹尼尔

【讨论】:

  • 这很有趣。 Qt Creator buildopencv_core231.dll 链接,Visual Studio buildopencv_core231d.dll 链接。 (Note about the DLLs.) 常规 DLL 和 'd' DLL 之间有什么区别,这告诉了我们什么有关问题的信息?
  • 带'd'的那个是调试版本,它给你更多的调试信息。另一个没有“d”的版本是发布版本,这意味着它通常可以运行得更快并且尺寸更小。您应该能够告诉编译器程序需要链接哪个 dll。显然,在 Qt 中你要求编译器链接发布版本,而在 VS 中你链接到调试版本。
  • Bingo,我想通了...当我进行调试构建时,我需要与 OpenCV 的调试 DLL 链接,否则写出将莫名其妙地失败。感谢您的获奖答案 - 赏金是您的!
  • 哇,你成功了,我只是给了你一个小线索 =) 感谢您的赏金,这是我的第一个。
  • Dependency Walker 非常适合这些场景。很好的答案。
【解决方案4】:

我遇到了同样的运行时错误“opencv error unspecified error (could not find a writer for the specified extension)”。我使用了和Pieter一样的解决方案,就是在项目设置-->链接器-->输入-->附加依赖项中,我指定使用opencv libs的debug版本进行MSVS调试配置,并指定使用release用于 MSVS 发布配置的 opencv 库版本。然后运行时错误消失了。

【讨论】:

    【解决方案5】:

    只需提及您希望保存图像的格式,例如 image.jpg、image.jpeg

    cv2.imwrite('image.jpg',image)
    

    【讨论】:

    • 当问题显然是 C++ 时,此答案也使用 Python OpenCV 绑定。通过仔细阅读问题,您需要更加了解您发布的答案。
    • 我遇到了同样的错误,我没有用文件名指定扩展名或图像格式。这是python情况下的正确答案。
    • 我也使用上面提到的技巧在 Python 中得到了结果,非常感谢。
    • 很奇怪,但在我的情况下:out.ong 而不是out.png
    【解决方案6】:

    是的,它对我有用。
    对于调试,只需删除*.lib left *d.lib (Property Pages/Linker/Input/Additional Dependencies),只需复制这些*d.lib

    【讨论】:

      【解决方案7】:

      我也遇到过这个问题,我观察到当我使用没有任何扩展名的图像时会出现这个问题。喜欢abc.jpg,但我只重命名为abc

      您必须使用带有扩展名的图像名称。

      【讨论】:

      • 感谢解决问题!
      • 我犯了一个多么愚蠢的错误......非常感谢这个答案
      • 谢谢。 74 位开发人员在检查代码之前查看了 SO。
      • 我希望 opencv 有错误不会强制这样回答
      • 我不敢相信我忘记了.png...谢谢伙计!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 2011-04-24
      相关资源
      最近更新 更多