C++ OpenCV imwrite()未保存图像

C++ OpenCV imwrite()未保存图像,c++,opencv,C++,Opencv,我正试图在我的mac上保存OpenCV中的图像,我正在使用以下代码,但到目前为止它还没有工作 cv::imwrite("/Users/nickporter/Desktop/Gray_Image.jpg", cvImage); 有人知道为什么不保存吗?OpenCV在保存到JPG图像时确实存在问题有时,请尝试保存到BMP: cv::imwrite("/Users/nickporter/Desktop/Gray_Image.bmp", cvImage); 此外,在此之前,请确保imagecvIma

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

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

有人知道为什么不保存吗?

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

cv::imwrite("/Users/nickporter/Desktop/Gray_Image.bmp", cvImage);
此外,在此之前,请确保image
cvImage
有效。您可以先显示图像进行检查:

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

我刚刚遇到了一个类似的问题,加载一个jpg并试图将其保存回jpg。添加了这个代码,现在看起来很好

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

我遇到了同样的问题,一个可能的原因是目标文件夹中放置了您的图像。假设您想将A.jpg复制到文件夹
“C:\\folder1\\folder2\\”
,但实际上当
folder2
不存在时,复制就无法成功(这是我实际测试的结果,不是官方发布的结果)。我通过检查文件夹是否存在来解决这个问题,如果不存在,就创建一个文件夹。这里有一些代码可以帮助使用C++和Booo::文件系统。愿它有帮助

#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);
#包括
#包括
std::string str_target=“C:\\folder1\\folder2\\img.jpg”;
boost::filesystem::path\u目标(str\u目标);
boost::filesystem::path path_folder=path_target.parent_path()//提取文件夹
如果(!boost::filesystem::exists(path_folder))//如果不存在,则创建文件夹
{
boost::filesystem::创建目录(路径文件夹);
}  
cv::imwrite(str\u目标,input\u img);

我还建议检查文件夹权限。即使输出文件夹没有写入权限,Opencv也会从imwrite安静地返回,没有任何异常。

以下函数可以放到代码中,以支持出于调试目的写入jpg图像

您只需要为它传入一个
图像
和一个
文件名
。在函数中,指定要写入的路径并具有写入权限

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);
}
void imageWrite(常量cv::Mat和image,常量std::字符串文件名)
{
//支持编写JPG
矢量压缩参数;
压缩参数。推回(CV\u IMWRITE\u JPEG\u质量);
压缩参数向后推(100);
//这将写入指定的路径
std::string path=“/path/you/provide/”+filename+“.jpg”;
cv::imwrite(路径、图像、压缩参数);
}
OpenCV 3.2 imwrite()在使用Windows调试模式编写jpg文件时似乎有问题。我用这种方式代替imwrite()


虽然你的情况不是这样。如果作为cv::imwrite函数参数提供的图像路径超过系统允许的最大路径长度(或可能允许的文件名长度),则可能会出现此问题

有关linux,请参阅:


对于windows,请参见:

什么是“不工作”的意思?建筑错误?运行时错误?或者您找不到存储的图像?您可以:检查此函数的返回值,或显示
cvImage
以查看图像是否正确。当我说不工作时,代码正在编译,但我没有看到保存到目标的图像。此调用的返回值是多少?
imshow
是否可以显示
cvImage
?我尝试了
imshow
,但得到了一个很长的异常。看看我的问题:你的图书馆似乎有一些问题。很抱歉,我不知道如何在MAC中解决它。那cvShowImage呢?你可以编写一个简单的c程序来测试
load
cvShowImage
。。。。尝试了我能想到的一切,改成了.bmp,突然它就工作了。谢谢你,伙计,该死的MVP!我也是这么做的,西皮!多么令人沮丧的哈哈。这是一个令人沮丧的问题,jpg不起作用。我希望解决方案能修复写入jpg而不是这个创可贴。我遇到了同样的问题。将文件扩展名更改为
.bmp
,它神奇地开始工作。OpenCV 3.4非常奇怪。保存到png在一段时间前起了作用。它突然停止工作了。保存到bmp works;)
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::Mat cvImage;

#ifdef DEBUG

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

#else

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

#endif