Visual c++ OpenCV imwrite 2.2导致异常,消息为;OpenCV错误:未指定的错误(找不到指定扩展名的写入程序)";在Windows7上

Visual c++ OpenCV imwrite 2.2导致异常,消息为;OpenCV错误:未指定的错误(找不到指定扩展名的写入程序)";在Windows7上,visual-c++,windows-7,opencv,Visual C++,Windows 7,Opencv,我正在将一个OpenCV 2.2应用程序从Unix(可以工作)移植到64位Windows 7上,当调用cv::imwrite时,我收到以下异常 OpenCV错误:未知函数的highgui\src\loadsave.cpp文件中出现未指定的错误(找不到指定扩展名的写入程序) 最初的unix应用程序在我的Mac和Linux设备上运行良好 有人知道我可能缺少什么库或编译器配置,使它可以在Windows上运行吗 更新: 为了让OpenCV运行,我做了以下事情: 从windows的OpenCV站点下载了

我正在将一个OpenCV 2.2应用程序从Unix(可以工作)移植到64位Windows 7上,当调用cv::imwrite时,我收到以下异常

OpenCV错误:未知函数的highgui\src\loadsave.cpp文件中出现未指定的错误(找不到指定扩展名的写入程序)

最初的unix应用程序在我的Mac和Linux设备上运行良好

有人知道我可能缺少什么库或编译器配置,使它可以在Windows上运行吗

更新:

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

  • 从windows的OpenCV站点下载了v2.2的二进制文件。我使用2.2是因为最初的应用程序使用它,我不想在这个阶段使我的构建复杂化
  • 我正在尝试imwrite到一个.png文件。我查看了OpenCV代码并注意到编码器(如PNG或JPEG)需要外部LIB,因此我尝试写入.ppm、.bmp,这似乎不需要DEP,但我得到了相同的错误
  • 我使用的一个例子是cv::imwrite(“out.png”,cv_scaled);其中,cv_scaled的类型为cv::Mat,格式为cv_32FC1
  • 请记住,相同的代码在unix中运行良好
.bmp或.ppm不起作用这一事实引发了更多的问题:

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

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

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

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

没有更多的信息就可以说这些了

编辑:

<> P>因为我还没有使用OpenCV的C++接口(VS3.VS2005)构建应用程序,所以我最终使用了如下的解决方法:在必要时将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); 
从:

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

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

然而,即使使用单通道8位文件,我在尝试保存jpg或png文件时也遇到未知的扩展名错误,但发现bmp可以工作。

试试看

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

imwrite("test.jpg", image);

这是您正在使用的版本。

谢谢@karlphillip-我已经更新了问题,以包含有关我的使用的更多详细信息。我甚至无法使用
imread()
在带有OpenCV 2.3的WinXP上加载JPG。哈哈。在进入
imwrite()
之前,我必须解决这个问题。让我们知道你的发现。哪些库(LIBS/DLL)是你的应用程序引用?只是我愚蠢的IMALD/IMADE项目需要的2个:OpenCVH-HuGui230.LIB和OpenCVIORICOR230.LIBBY,如果我使用C接口而不是C++,代码就工作了。+ 1也发生在<代码> imDead()中。在我的WinXP机器上的VS2005上的OpenCV 2.3版本。我也有同样的问题,我在构建调试时使用了OpenCV的发行库。我已将库更改为调试库,问题已得到解决。以防有人犯了和我一样的错误。