【问题标题】:OpenCV imwrite() not saving imageOpenCV imwrite()不保存图像
【发布时间】: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

标签: c++ opencv


【解决方案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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-02-27
              • 1970-01-01
              • 2019-09-03
              • 1970-01-01
              • 2013-04-10
              • 1970-01-01
              • 2020-03-17
              • 1970-01-01
              相关资源
              最近更新 更多