OpenCV的imwrite()函数无法保存图像

18

我正试图在我的Mac上从OpenCV保存一张图片,我正在使用以下代码,但到目前为止它还没有工作。

cv::imwrite("/Users/nickporter/Desktop/Gray_Image.jpg", cvImage);

有人能看出为什么这可能没有保存吗?


1
“not been working” 是什么意思?构建错误?运行时错误?还是找不到存储的图像?您可以:检查此函数的返回值,或显示 cvImage 以查看图像是否正确。 - feihu
当我说“不工作”时,代码编译正常,但是我在目标位置看不到保存的图像。 - user2780240
这个调用的返回值是什么?imshow能够显示cvImage吗? - feihu
我尝试使用imshow,但是出现了一个很长的异常。请查看我的问题:http://answers.opencv.org/question/29895/imshow-throwing-exception-osx/ - user2780240
似乎你的库存在一些问题。抱歉我不知道如何在MAC上解决它。cvShowImage怎么样?你可以编写一个简单的C程序来测试loadcvShowImage - feihu
7个回答

24

OpenCV有时在保存JPG图像方面存在问题,尝试改为保存为BMP格式:

cv::imwrite("/Users/nickporter/Desktop/Gray_Image.bmp", cvImage);

在此之前,请确保您的图像cvImage是有效的。您可以通过先显示图像来检查它:

在此之前,请确保您的图像cvImage是有效的。您可以通过先显示图像来检查它:

namedWindow("image", WINDOW_AUTOSIZE);
imshow("image", cvImage);
waitKey(30);

3
我已经尝试了很长时间保存一个该死的 jpg 图像... 试过我能想到的一切方法,改成 .bmp 格式后突然就可以了。谢谢你,伙计,真是个厉害的人! - Sipty
我也在做同样的事情,Sipty!太令人沮丧了哈哈。很遗憾JPG文件无法工作。 - amartin7211
我希望这个解决方案能够修复写入jpg的问题,而不是采用这种权宜之计。 - fizzybear
我也遇到了同样的问题。把文件扩展名改为 .bmp,神奇地就开始工作了。OpenCV 3.4 facepalm - user189198
非常奇怪。以前保存为png可以工作,现在突然停止工作了。保存为bmp可以工作 ;) - Pe Dro
只需关闭由imshow打开的所有窗口,您就可以保存图像,无论是jpg还是bmp。 - Arthur

11
我遇到了同样的问题,可能的原因之一是目标文件夹未创建。假设您想将A.jpg复制到文件夹"C:\\folder1\\folder2\\",但实际上当folder2不存在时,复制操作就会失败(这是我的实际测试结果,不是官方公告)。我通过检查文件夹是否存在并在不存在时创建一个文件夹来解决了这个问题。以下是一些代码,希望能帮助使用c++和boost::filesystem。
#include <boost/filesystem.hpp>  
#include <iostream>
std::string str_target="C:\\folder1\\folder2\\img.jpg";

boost::filesystem::path path_target(str_target);
boost::filesystem::path path_folder=path_target.parent_path();//extract   folder
if(!boost::filesystem::exists(path_folder)) //create folder if it doesn't exist
{
  boost::filesystem::create_directory(path_folder);
}  
cv::imwrite(str_target,input_img);

3
我建议您检查文件夹权限。即使输出文件夹没有写入权限,OpenCV也会静默返回imwrite,而不抛出任何异常。

1

我刚遇到了类似的问题,尝试加载 jpg 文件并将其保存为 jpg。添加了这段代码后,现在看起来已经没问题了。

vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
compression_params.push_back(100);

你需要在writefile中包含参数。
cv::imwrite("/Users/nickporter/Desktop/Gray_Image.jpg", cvImage, compression_params);

1
OpenCV 3.2的imwrite()似乎在Windows Debug模式下写入jpg文件时存在问题。我使用了这种方式来代替imwrite()。
cv::Mat cvImage;

#ifdef DEBUG

IplImage image = IplImage(cvImage);
cvSaveImage("filename.jpg", &image);

#else

cv::imwrite("filename.jpg", cvImage);

#endif

我在Linux上使用OpenCV 3.2.0版本的imwrite()函数写JPEG时遇到了问题。 - s.paszko

0
以下函数可用于您的代码中,以支持为调试目的编写jpg图像。
您只需要传入一个image和一个filename。在函数中,指定您希望写入的路径,并具有执行此操作的权限。
void imageWrite(const cv::Mat &image, const std::string filename)
{
    // Support for writing JPG
    vector<int> compression_params;
    compression_params.push_back( CV_IMWRITE_JPEG_QUALITY );
    compression_params.push_back( 100 );

    // This writes to the specified path
    std::string path = "/path/you/provide/" + filename + ".jpg";

    cv::imwrite(path, image, compression_params);
}

0

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