【发布时间】:2020-10-27 16:38:29
【问题描述】:
我想使用 C++ API 创建一个 8 通道的 openCV 图像:
cv::Mat lookupTable = cv::Mat(height, width, CV_32FC(8), cv::Scalar::all(-1.f));
我得到:
external/opencv/modules/core/src/array.cpp:3229: error: (-215:Assertion failed) cn <= 4 in function 'scalarToRawData'
我很确定 OpenCV 支持多通道 >4 图像。我错了吗?
更新 1:
显然它与初始化值cv::Scalar::all(-1.f)有关。仅限于cv::Vec<T,4>。然而,
cv::Vec<float, 8> a = {-1.f, -1.f, -1.f, -1.f, 1.f, -1.f, -1.f, -1.f};
cv::Mat lookupTable = cv::Mat(height, width, CV_32FC(8), a);
也不支持,并且失败并出现同样的错误。
更新 2:
cv::Mat lookupTable = cv::Mat(height, width, CV_32FC(8));
lookupTable.setTo(-1);
编译并运行,但我还没有验证 all 值是否真的初始化为 -1。
但是,下一个问题是 cv::imwrite() 无法保存该图像。
哦,伙计..真是一团糟!
更新 3:好的,我可以确认 lookupTable.setTo(-1) 有效,并且所有值都已相应初始化。此外,保存该图像的方法是通过cv::FileStorage。
cv::FileStorage fs("lookup.ext", cv::FileStorage::WRITE_BASE64);
fs.write("LUT",lookupTable);
但是,这是以文本格式保存的,似乎无法以二进制格式存储:-(
更新 4:
好的,将.gz 附加到扩展名即可压缩文件。
cv::FileStorage fs("lookup.ext.gz", cv::FileStorage::WRITE_BASE64);
【问题讨论】:
-
你好。您可以在 n 个通道中拆分图像并将它们保存在不同的文件中。然后你必须在读取通道时重建图像。
-
嗨让-马克!是的,我知道这个解决方案。我可以这样做,但是,这不是我打算在这里做的。我看到我可以将通用
cv::Mats保存为 JSON/XML。想知道是否还有将这些存储为二进制文件的选项。 -
TIFF 可能是保存多通道图像的最佳格式,并且通常是多/高光谱卫星图像的首选格式。
-
谢谢马克!我希望直接用 OpenCV 做到这一点。我知道
tiff格式支持多通道图像,但我相信不是通过 OpenCV API。