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程序来测试load
和cvShowImage
。
【参考方案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)