OpenCV imwrite 2.2 导致异常与消息"OpenCV Error: Unspecified error (could not find a writer for the specifie



我正在将OpenCV 2.2应用程序从Unix(工作)移植到Windows 7 64位,当cv::imwrite被称为

时,我收到以下异常

"在未知函数中,文件highguisrcloadsave.cpp中,OpenCV错误:未指定的错误(无法找到指定扩展名的写入器)"

原来的unix应用程序在我的Mac和Linux机器上运行良好。

有人知道我可能会错过什么库或编译器配置,使这个工作在Windows上?

更新:

我做了以下事情让OpenCV运行:

  • 从windows的OpenCV站点下载了v2.2的二进制文件。我使用2.2是因为原来的应用程序使用它,我不想在这个阶段使我的构建复杂化。
  • 我正在尝试写入一个。png文件。我看了看OpenCV代码,并注意到需要外部库的编码器,如png或jpeg,所以我试着写。ppm, .bmp,这似乎不需要深度,但我得到相同的错误。我使用的一个例子是cv::imwrite("out.png", cv_scaled);其中cv_scaled的类型为cv::Mat,格式为CV_32FC1
  • 请记住相同的代码在unix
  • 中工作良好

事实。bmp或。ppm不能工作,这引发了更多的问题:

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

再次感谢您帮助我调试这个问题

您当前安装的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::MatIplImage*的转换不是那么明显,但它也很简单,技巧是使用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); 

Try

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

imwrite("test.jpg", image);

来自OpenCV 2.2 API:

imwrite函数将图像保存到指定的文件中。图像格式是根据文件扩展名选择的,请参阅imread查看扩展名列表。使用此功能只能保存8位(或16位在PNG, JPEG 2000和TIFF的情况下)单通道或3通道(与' BGR '通道顺序)图像。如果格式、深度或通道顺序不同,请在保存前使用Mat::convertTo和cvtColor进行转换,或使用通用的XML I/O函数将图像保存为XML或YAML格式。

在保存之前将文件转换为8位或16位可能会更幸运。

然而,即使是单通道8位文件,我也有未知的扩展名错误,试图保存jpg或png文件,但发现bmp工作。

最新更新