簡體   English   中英

OpenCV imwrite() 不保存圖像

[英]OpenCV imwrite() not saving image

我正在嘗試在我的 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.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);

我還建議檢查文件夾權限。 即使輸出文件夾沒有寫入權限,Opencv 也會悄悄地從 imwrite 返回,沒有任何異常。

我剛剛遇到了類似的問題,加載 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);

可以將以下函數放入您的代碼中,以支持寫出 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);
}

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

雖然對於您的情況並非如此。 如果作為參數提供給 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM