目标
本教程将向您展示
- 注意
- 目前,仅支持读取和写入 cv::Mat,并且矩阵在内存中应该是连续的。尚未实现对其他数据类型的支持。
源代码
以下代码演示了将单通道矩阵和双通道矩阵写入数据集,然后将它们读取回来。
您可以从 这里 下载代码,或在 opencv_contrib 源代码库的 modules/hdf/samples/create_read_write_datasets.cpp 文件中找到它。
#include <iostream>
static void write_root_group_single_channel()
{
String filename =
"root_group_single_channel.h5";
String dataset_name =
"/single";
h5io->dswrite(data, dataset_name);
h5io->dsread(expected, dataset_name);
double diff =
norm(data - expected);
h5io->close();
}
static void write_single_channel()
{
String filename =
"single_channel.h5";
String dataset_name = parent_name +
"/single";
if (!h5io->hlexists(parent_name)) h5io->grcreate(parent_name);
if (!h5io->hlexists(dataset_name)) h5io->dscreate(data.
rows, data.
cols, data.
type(), dataset_name);
h5io->dswrite(data, dataset_name);
h5io->dsread(expected, dataset_name);
double diff =
norm(data - expected);
h5io->close();
}
static void write_multiple_channels()
{
String filename =
"two_channels.h5";
String dataset_name = parent_name +
"/two_channels";
((
int*) data.
data)[i] = (int)i;
if (!h5io->hlexists(parent_name)) h5io->grcreate(parent_name);
if (!h5io->hlexists(dataset_name)) h5io->dscreate(data.
rows, data.
cols, data.
type(), dataset_name);
h5io->dswrite(data, dataset_name);
h5io->dsread(expected, dataset_name);
double diff =
norm(data - expected);
h5io->close();
}
{
write_root_group_single_channel();
write_single_channel();
write_multiple_channels();
return 0;
}
#define CV_32SC2
定义 interface.h:113
说明
创建数据集的第一步是打开文件
对于函数 write_root_group_single_channel(),由于数据集名称是 /single,它位于根组内,我们可以使用
h5io->dswrite(data, dataset_name);
将数据直接写入数据集,而无需预先创建它。因为它是在 cv::hdf::HDF5::dswrite() 中自动创建的。
- 警告
- 这仅适用于位于根组内的数据集。
当然,我们可以自己创建数据集
if (!h5io->hlexists(parent_name)) h5io->grcreate(parent_name);
if (!h5io->hlexists(dataset_name)) h5io->dscreate(data.
rows, data.
cols, data.
type(), dataset_name);
要从数据集读取数据,我们使用
h5io->dsread(expected, dataset_name);
通过指定数据集的名称。
我们可以通过使用
double diff =
norm(data - expected);
结果
图 1 显示了使用工具 HDFView 可视化文件 root_group_single_channel 的结果。图 2 和图 3 分别给出了非根组直接子数据集矩阵的结果。
图 1:将单通道矩阵写入根组内数据集的结果
图 2:将单通道矩阵写入非根组数据集的结果
图 3:将双通道矩阵写入非根组数据集的结果