我正在将一个 OpenCV 2.2 应用程序从 Unix(可以运行)移植到 Windows 7 64 位,并且在调用 cv::imwrite 时收到以下异常
“OpenCV 错误:未知函数中的未指定错误(找不到指定扩展名的编写器,文件 highgui\src\loadsave.cpp”
原始的 unix 应用程序在我的 Mac 和 Linux 机器上运行良好。
有谁知道我可能缺少什么库或编译器配置才能使它在 Windows 上运行?
更新:
我做了以下事情来运行 OpenCV:
- 从适用于 Windows 的 OpenCV 站点下载了 v2.2 的二进制文件。我正在使用 2.2,因为原始应用程序使用它,我不想在这个阶段使我的构建复杂化。
- 我正在尝试写入 .png 文件。我查看了 OpenCV 代码并注意到编码器(如 Pngs 或 jpegs)需要外部库,所以我尝试写入 .ppm、.bmp,这似乎不需要 deps,但我得到了相同的错误。
- 我的用法示例是 cv::imwrite("out.png", cv_scaled);其中 cv_scaled 是 cv::Mat 类型,格式为 CV_32FC1
- 请记住相同的代码在 unix 中工作正常
.bmp 或 .ppm 不起作用的事实引发了更多问题:
- 为什么这些非常简单的格式不起作用?
- 有没有办法以编程方式查看已安装编码器的列表?
再次感谢您帮助我调试这个问题。
最佳答案
您当前安装的 OpenCV 不支持您尝试在磁盘上创建的文件格式。
检查文件的扩展名是否正确。如果是,您将不得不重新编译 OpenCV 并添加对此格式的支持,并可能安装您缺少的库。
如果没有更多信息,就只能这么说了。
编辑:
因为我也未能构建使用 OpenCV(VS2005 上的 v2.3)的 C++ 接口(interface)的应用程序,所以我最终使用了以下解决方法:在必要时将 C++ 类型转换为 C 类型。
将 IplImage*
转换为 cv::Mat
非常简单:
IplImage* ipl_img = cvLoadImage("test.jpg", CV_LOAD_IMAGE_UNCHANGED);
Mat mat_img(ipl_img);
imshow("window", mat_img);
cv::Mat
到IplImage*
的转换不是很明显,但也很简单,诀窍是使用一个IplImage
而不是 IplImage*
:
IplImage ipl_from_mat((IplImage)mat_img);
cvNamedWindow("window", CV_WINDOW_AUTOSIZE);
// and then pass the memory address of the variable when you need it as IplImage*
cvShowImage("window", &ipl_from_mat);
关于visual-c++ - OpenCV imwrite 2.2 在 Windows 7 上导致异常,消息为 "OpenCV Error: Unspecified error (could not find a writer for the specified extension)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6923296/