使用cv :: FileStorage从文本文件加载多维数据垫

时间:2015-02-27 10:19:23

标签: c++ opencv

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

抛出错误:

" CRF_6Epochs_d.exe位于0x000007FEFD7D940D处的未处理异常:Microsoft C ++异常:cv ::内存位置0x000000000015C3D0的异常"。

控制台中显示错误:

" 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();

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

因为我遇到了同样的问题。问题是从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"];