在Windows 7上,OpenCV imwrite 2.2导致异常,并显示消息“OpenCV错误:未指定错误(找不到指定扩展名的编写器)”

时间:2011-08-03 07:56:48

标签: visual-c++ windows-7 opencv

我正在将一个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无法解决问题:

  • 为什么这些非常简单的格式不起作用?
  • 有没有办法以编程方式查看已安装的编码器列表?

再次感谢您帮助我调试此问题。

2 个答案:

答案 0 :(得分:9)

您当前安装的OpenCV不支持您尝试在磁盘上创建的文件格式。

检查文件的扩展名是否正确。如果是,您将不得不重新编译OpenCV并添加对此格式的支持,并可能安装您缺少的库。

如果没有更多信息,就可以说这一切。

修改

由于构建使用OpenCV的C ++接口(VS2005上的v2.3)的应用程序也失败了,我最终使用了以下解决方法:在必要时将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); 

答案 1 :(得分:4)

尝试

cvSaveImage("test.jpg", &(IplImage(image)));

而不是

imwrite("test.jpg", image);

您使用的版本为a known bug