无法在OpenCV中使用imwrite编写图像

时间:2015-10-28 17:14:08

标签: c++ opencv

我正在尝试使用imwrite写入图像,如下所示:

Mat object = imread ("C:/Users/User/Desktop/book.jpg", CV_LOAD_IMAGE_GRAYSCALE);
//calculate integral image
        Mat iObject;
        integral(object, iObject);
        imshow("Good Matches", iObject);
        imwrite("C:/Users/User/Desktop/IntegralImage.jpg", iObject);
        cvWaitKey(0);

但它没有成功,我读到它,一些解决方案是将jpg改为bmp。我也尝试了但没有结果!请帮忙

1 个答案:

答案 0 :(得分:1)

无法保存图片

这是因为您没有在该位置写入的权限。解决方案:

  1. 以管理员身份启动您的程序
  2. 更改为您拥有足够权限的位置
  3. 整体图片已保存空白

    积分图像的类型为CV_32UC1,因此高于255的值将饱和为255,并保存为 white 。您无法从保存的图像中恢复原始值。

    解决方案:

    1. 将值标准化以适合范围[0,255],并保存CV_8U图像。您无法从保存的图像中恢复原始值,但至少会缩放并正确显示。

    2. 使用FileStorage保存原始数据。保留原始值。

    3. 如果您需要更快的FileStorage速度,则可以保存原始二进制数据。有关示例,请参阅here。保留原始值。

    4. 这是显示解决方案1和2的示例代码。对于3,请参阅给定的链接。

      #include <opencv2\opencv.hpp>
      using namespace cv;
      
      int main()
      {
          // Load image
          Mat1b object = imread("path_to_image", IMREAD_GRAYSCALE);
      
          // Calculate integral image
          Mat1i iObject;
          integral(object, iObject);
      
          imwrite("save_1i.png", iObject);
      
          // the saved image has saturated values
      
          // /////////////////////////////////////////
      
          // Save using imwrite
          Mat1b save_1b;
          normalize(iObject, save_1b, 255, 0, NORM_MINMAX);
          imwrite("save_1b.png", save_1b);
      
          // the saved image has scaled values, but displayed correctly
      
      
          // /////////////////////////////////////////
      
          // Save using FileStorage
          {
              FileStorage fs("save_fs.yml", FileStorage::WRITE);
              fs << "integral" << iObject;
      
              // the saved file has original values
          }
      
      
          // Load using FileStorage
          Mat1i loadedIObject;
          {
              FileStorage fs("save_fs.yml", FileStorage::READ);
              fs["integral"] >> loadedIObject;
          }
      
          // loadedIObject has original values
      
          return 0;
      }