OpenCV imwrite()不保存图像

OpenCV imwrite() not saving image

本文关键字:保存 图像 imwrite OpenCV      更新时间:2023-10-16

我正在尝试从我的mac上保存OpenCV的图像,我正在使用以下代码,到目前为止它还没有工作。

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

有人知道为什么这可能不是保存?

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

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

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

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

我遇到了同样的问题,一个可能的原因是放置图像的目标文件夹。假设您想要复制a.p jpg到文件夹"C:\folder1\folder2\",但实际上当folder2不存在时,复制不能成功(这是我的实际测试,而不是来自官方公告)。我通过检查文件夹是否存在来解决这个问题,如果不存在就创建一个文件夹。这里是一些代码,可能会帮助使用c++ &boost::文件系统。希望能有所帮助。

#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);

我还建议检查文件夹权限。即使输出文件夹没有写权限,Opencv也会悄悄地从imwrite返回。

我刚刚遇到了一个类似的问题,加载一个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);

OpenCV 3.2 imwrite()似乎有一个问题,写jpg文件与Windows调试模式。我用这种方法来代替imwrite()。

cv::Mat cvImage;
#ifdef DEBUG
IplImage image = IplImage(cvImage);
cvSaveImage("filename.jpg", &image);
#else
cv::imwrite("filename.jpg", cvImage);
#endif

可以在代码中添加以下函数,以支持输出用于调试的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);
}

尽管它不适合您的情况。如果作为参数给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