0

我正在尝试在 C# 中做 opencvsharp 的立体视觉。我已经将失真矩阵存储在 xml 文件中。现在我想读取该矩阵以用于计算。我试过这段代码:

FileStorage fs = new FileStorage();
fs.Open("intrinsics.yml",FileStorageMode.FormatYaml);
Mat M1, M2, D1, D2;
fs["M1"] >> M1;
fs["D1"] >> D1;
fs["M2"] >> M2;
fs["D2"] >> D2;

但它不起作用。有人可以帮我吗?提前致谢。P/S:对不起我的英语不好!

4

1 回答 1

1

我按照 OpenCvSharp 存储库中提供的示例从 XML 文件中加载了矩阵的值。

我是这样做的:

Mat matrix;

using (CvFileStorage fs = new CvFileStorage(xmlfile, null, FileStorageMode.Read))
{
    CvFileNode param = fs.GetFileNodeByName(null, nodeName);
    matrix = new Mat(fs.Read<CvMat>(param));
}

其中 xmlfile 是您拥有的 XML/YAML 文件的路径(在您的情况下:“intrinsics.yml”),nodeName 是一个字符串,其中包含您的 Mat 存储在文件中的节点的名称。

值得一提的是,此函数将对象加载为 CvMat,而不是 Mat,这就是为什么有一个:

new Mat()

将其转换为您需要的内容。如果需要恢复更多数据,可以在使用括号内加载更多值。

为了完整起见,以下是您将值写入 XML/YAML 文件的方式:

Mat matrix;
string nodeName = "sample_matrix";

using (CvFileStorage fs = new CvFileStorage(xmlfile, null, FileStorageMode.Write))
{
    fs.Write(nodeName, matrix.ToCvMat());
    fs.StartNextStream();
}

如果您只想向文件添加值而不是完全重写它,则可以将 FileStorageMode.Write 交换为 FileStorageMode.Append。

作为参考,这是示例代码文件

于 2015-06-03T15:39:41.367 回答