我正在尝试使用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。我也尝试了但没有结果!请帮忙
答案 0 :(得分:1)
无法保存图片
这是因为您没有在该位置写入的权限。解决方案:
整体图片已保存空白
积分图像的类型为CV_32UC1
,因此高于255的值将饱和为255,并保存为 white 。您无法从保存的图像中恢复原始值。
解决方案:
将值标准化以适合范围[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;
}