OpenCV imwrite()不保存图像

Posted

技术标签:

【中文标题】OpenCV imwrite()不保存图像【英文标题】:OpenCV imwrite() not saving image 【发布时间】:2014-03-13 04:36:12 【问题描述】:

我正在尝试在我的 Mac 上保存来自 OpenCV 的图像,并且我正在使用以下代码,但到目前为止它还没有工作。

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

谁能明白为什么这可能无法保存?

【问题讨论】:

“没有工作”是什么意思?建筑错误?运行时错误?或者您找不到存储的图像?您可以:检查此函数的返回值,或显示cvImage 以查看图像是否正确。 当我说不工作时,代码编译正常,但我没有看到保存到目的地的图像。 这个调用的返回值是多少? cvImage 可以被imshow 显示吗? 我尝试了imshow 并得到了一个冗长的异常。在这里查看我的问题:answers.opencv.org/question/29895/imshow-throwing-exception-osx 您的图书馆似乎有问题。抱歉,我不知道如何在 MAC 中解决它。 cvShowImage 呢?你可以写一个简单的c程序来测试loadcvShowImage 【参考方案1】:

OpenCV 有时在保存到JPG 图像时确实存在问题,请尝试保存到BMP

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

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

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

【讨论】:

我一直在尝试保存一个血腥的 jpg 图像最长时间......尝试了我能想到的一切,更改为 .bmp 并且突然它起作用了。谢谢老兄,该死的 MVP! 我在做同样的事情,Sipty!好郁闷哈哈。这是一个无赖 jpg 的不工作 我希望解决方案能够将写入文件固定为 jpg 而不是这个创可贴。 我遇到了同样的问题。将文件扩展名更改为.bmp,它神奇地开始工作。 OpenCV 3.4 facepalm 很奇怪。保存到 png 有一段时间了。它突然停止工作。保存到 bmp 作品 ;)【参考方案2】:

我遇到了同样的问题,一个可能的原因是放置图像的目标文件夹。假设你想将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 中返回。

【讨论】:

【参考方案4】:

我刚刚遇到了类似的问题,加载 jpg 并尝试将其另存为 jpg。添加了此代码,现在似乎很好。

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

并且您需要在您的写入文件中包含参数。

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

【讨论】:

【参考方案5】:

可以将以下函数放入您的代码中,以支持写出 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);

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

尽管您的情况并非如此。如果作为参数提供给 cv::imwrite 函数的图像路径超过系统允许的最大路径长度(或可能允许的文件名长度),则可能会出现此问题。

对于 linux,请参阅:https://unix.stackexchange.com/questions/32795/what-is-the-maximum-allowed-filename-and-folder-size-with-ecryptfs

对于 Windows,请参阅:https://www.quora.com/What-is-the-maximum-character-limit-for-file-names-in-windows-10

【讨论】:

以上是关于OpenCV imwrite()不保存图像的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV Python:如何避免 py3 中的 cv2.imwrite() 内存“泄漏”?

OpenCV 函数学习02-图像的保存(cv2.imwrite)

[python3.6+opencv] 02 imwrite-打开图像后保存退出还是不保存退出的问题

OpenCV2.3 imwrite 保存黑色图像

利用OpenCV的函数imwrite()保存图像到硬盘

如何在 OpenCV 2.4.3 中保存(cvWrite 或 imwrite)图像?