我正在尝试使用 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。我也试过了,但没有结果!请帮忙
最佳答案
无法保存图片
这是因为您没有在该位置写入的权限。解决方案:
- 以管理员身份启动程序
- 更改到您有足够权限的位置
积分图像保存空白
积分图的类型是CV_32UC1
,所以大于255的值会饱和到255,保存为白色。您无法从保存的图像中恢复原始值。
解决方案:
标准化值以适应范围
[0,255]
,并保存CV_8U
图像。您无法从保存的图像中恢复原始值,但至少可以正确缩放和显示。使用
FileStorage
保存原始数据。您保留原始值。如果您需要比
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/