【问题标题】:Load Multi-dimensional Mat from Text File using cv::FileStorage使用 cv::FileStorage 从文本文件加载多维 Mat
【发布时间】:2015-04-30 00:33:45
【问题描述】:

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

抛出错误:

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

控制台显示错误:

"OpenCV Error: Unspecified error (Too complex format for the matrix) in unknown function, file ......\modules\core\src\persistence.cpp, line 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();

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

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

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

    然后将其重新整形为所需的通道数:

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

    您也可以将频道数保存在FileStorage 中,如果仍然不固定的话。

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

    【讨论】:

      【解决方案2】:

      据我所知,您只能将 opencv 中的数据保存到 xml 和 yaml 文件中。所以将您的 Test.txt 更改为 xml pt yaml 文件。

      【讨论】:

      • errm,不, - 任何未明确命名为 ***.xml 的内容都将保存为 yaml。 (发帖前请自行尝试)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      相关资源
      最近更新 更多