c++ - 无法在 OpenCV 中使用 imwrite 写入图像

标签 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. 以管理员身份启动程序
  2. 更改到您有足够权限的位置

积分图像保存空白

积分图的类型是CV_32UC1,所以大于255的值会饱和到255,保存为白色。您无法从保存的图像中恢复原始值。

解决方案:

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

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

  3. 如果您需要比 FileStorage 更快的速度,您可以保存原始二进制数据。参见 here举个例子。您保留原始值。

这是显示解决方案 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;
}

关于c++ - 无法在 OpenCV 中使用 imwrite 写入图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33397398/

相关文章:

Python OpenCV cv2 绘制带文本的矩形

java - 使用 jni 将位图从 android 相机传递到 C++

c++ - OpenCV - 如果从一个线程调用两次,imshow 会挂起

java - 如何在 OpenCV (Java) 中使用 HoughLines 检测线条?

opencv - 如何计算ROI OpenCV中的像素

c++ - 为 boost python 编译的 .so 找不到模块

c++ - 从头文件中分解 C++ 源代码

c++ - std::stof 是解析整个字符串还是在第一个空格/换行符处停止?

c++ - 尽管通过了所有演示测试,SuiteSparse CHOLMOD 仍抛出 gpu_memorysize 错误

c++ - 隐式调用是什么意思?