OpenCV无法使用imwrite写入图像

4

我正试图将我创建的Mat格式写成jpeg文件,但我得到的只是一个未处理的异常。根据文档,它说:

只有8位(或16位无符号(CV_16U)对于PNG, JPEG 2000和TIFF)单通道或3通道(使用'BGR'通道顺序)图像可以使用此函数保存。

因此,我使用以下代码创建了一个Mat:

Mat watermark(5,5,CV_16U);  
imwrite("C:\\watermark.jpg",watermark);

然而,我无法将图像写入jpeg格式。使用BMP格式没有问题,但是JPG或任何其他格式都不行。有人建议将其转换为CV_16U或8U,但也没有起作用,而且我确实具有C:\目录的写权限。

我错过了什么步骤吗?还是我应该以其他方式保存图像为JPG使用OpenCV?


你确定 OpenCV 支持 JPEG 格式吗?你可以从<http://docs.opencv.org/doc/tutorials/introduction/display_image/display_image.html> 进行一个快速的读取测试,看看在这个设置上是否正常工作。 - Bobby
是的,我能够使用imread读取jpeg图像。但是写入(imwrite到除bmp以外的其他格式)让我很头疼。 - user1926691
奇怪。它失败时控制台上有任何错误打印吗?我看到你说你可以访问C:\,但是现在你遇到了问题,你可能想快速测试一下写入C:\Temp\watermark.jpg。除此之外,我会怀疑CV_16U格式,这方面我不是很专业。 - Bobby
当我写入C:\ Temp和C:\时,我会收到相同的错误。 “在MySIFT.exe中0x6eb1ee22处第一次机会异常:0xC0000005:访问冲突读取位置0x00000000。 在MySIFT.exe中0x6eb1ee22处未处理的异常:0xC0000005:访问冲突读取位置0x00000000。”这是我得到的异常。 - user1926691
在快速搜索中,这看起来非常接近:<http://stackoverflow.com/questions/13496712/opencv-unhandled-exception-when-writing-a-file> - 然而,在那里也没有得到答案。如果你没有看到任何回复,我建议准备进行调试构建并调试以查看是否有任何其他线索。(对于没有更多帮助的情况表示抱歉) - Bobby
尝试使用imwrite函数将图像保存为BMP格式文件,然后查看结果如何。 - herohuyongtao
2个回答

4
如果您使用的是最新的opencv(v3.0)或更高版本以及Windows x64位版本,一些opencv的功能在调试模式下无法正常工作...您必须在发布模式下运行代码,然后一切都将完美运行。
我发现opencv3.1和x64位-调试模式存在以下问题:
1. imwrite(filename, image) 异常错误(read access violation). 2. haarCascade.detectMultiScale(...)检测到大量对象。
要解决这些问题,请在发布模式下运行应用程序。
仍在寻找在调试模式下解决这些问题的好方法。

-2

这段代码运行正确,可以制作/重写“watermark.jpg”:

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>

using namespace cv;

int main() {    
    Mat watermark(5,5,CV_16U);
    imwrite("C:\\watermark.jpg",watermark);
    return 0;
}

我有Win7操作系统,Wascana Eclipse(MinGW GCC编译器),Opencv 2.4.5


这并不是一个真正的答案,而且这个问题已经半年了。 - jnovacho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接