目标
本教程向您展示
- 注意
- 目前,它只支持读取和写入 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;
}
从 Mat 派生的模板矩阵类。
定义 mat.hpp:2230
uchar * data
指向数据的指针
定义 mat.hpp:2140
int channels() const
返回矩阵通道数。
size_t total() const
返回数组元素的总数。
int rows
行和列的数量,或当矩阵具有超过 2 维时为 (-1, -1)
定义 mat.hpp:2138
int type() const
返回矩阵元素的类型。
std::string String
定义 cvstd.hpp:151
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
#define CV_32SC2
定义 interface.h:113
#define CV_Assert(expr)
在运行时检查条件,如果失败则抛出异常。
定义 base.hpp:342
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
与磁盘上的文件关联的文件存储的“黑盒”表示。
定义 core.hpp:102
解释
创建数据集的第一步是打开文件
对于函数 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:将单通道矩阵写入不在根组内的数据集的结果