c++ - 使用 cv::FileStorage 从文本文件加载多维 Mat

标签 c++ opencv

我已使用 cv::FileStorage 成功将大小为 (10,10, CV_32F24) 的 Mat 保存到文本文件中。但是,当我尝试使用 cv::FileStorage 再次加载/读取它时,它失败并给出以下错误:

抛出错误:

“CRF_6Epochs_d.exe 中 0x000007FEFD7D940D 处出现未处理的异常:Microsoft C++ 异常:内存位置 0x000000000015C3D0 处的 cv::Exception”。

控制台中显示错误:

“OpenCV错误:未知函数中的未指定错误(矩阵格式太复杂),文件......\modules\core\src\persistence.cpp,第3106行”

我的代码如下所示:

const char *Path = "J:\\DATA\\WorkDIR\\AOI\\MultiEpochs\\54By54KM2\\Nodes\\Test.txt";
FileStorage saveNode(Path, FileStorage::WRITE);
saveNode << "NodePot" << fv1;
saveNode.release();

FileStorage loadNode(Path, FileStorage::READ);
Mat N(imgSize.height, imgSize.width, CV_MAKETYPE(CV_32F,24));
if(!loadNode.isOpened()){
    throw std:: runtime_error("Failed to Open File");
}

loadNode["NodePot"] >> N;
loadNode.release();

最佳答案

因为我也遇到了同样的问题。问题是,当您从 FileStorage 加载 Mat 时, channel 数有上限。一种可能的解决方法是将 Mat reshape 为一个 channel ,如下所示:

saveNode << "NodePot" << fv1.reshape(1);

然后将其 reshape 回所需的 channel 数:

loadNode["NodePot"] >> N;
N = N.reshape(24);

如果 channel 数尚未修复,您还可以将其保存在FileStorage 中。

saveNode << "Channels" << fv1.channels();
int channels = (int)loadNode["Channels"];

关于c++ - 使用 cv::FileStorage 从文本文件加载多维 Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28762670/

相关文章:

android - OGLES 2 原生 Android : eglCreateWindowSurface Arguments

c++ - gltexcoord[].st 不适用于新硬件

c++ - 注册和使用使用运行时生成的 UUID 的 IDL 创建的 ActiveX/COM 组件

c++ - 将结构传递给线程,如何访问结构中的多个数据?

python - 使用numpy的调色板方法

opencv - Affine-SIFT(ASIFT) 特征检测器

c++ - 返回 boost multi_index 接口(interface)时 C++ 中的 const 混淆

c++ - QProgressBar 使应用程序消耗大量内存

python - 在 centos 上为 python 从源代码安装 opencv

OpenCV 2.4.3 Haar 分类器错误 AdaBoost misclass