OpenCV  4.10.0
开源计算机视觉
正在加载...
正在搜索...
没有匹配项
读写属性

目标

本教程介绍如何

  • 编写属性?
  • 读取属性?
注意
虽然属性可与组和数据集关联,但只在 OpenCV 中实现了具有根组的属性。属性类型支持 intdoublecv::Stringcv::InputArray(仅限于连续数组)。

源代码

以下代码演示了如何用数据类型 cv::Matcv::Stringintdouble 读写根组中的属性。

你可以从 此处 下载代码,或者在 opencv_contrib 源代码库的 modules/hdf/samples/read_write_attributes.cpp 文件中找到代码。

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/hdf.hpp>
using namespace cv;
static void read_write_attributes()
{
String filename = "attributes.h5";
Ptr<hdf::HDF5> h5io = hdf::open(filename);
String attr_mat_name = "array attribute";
Mat attr_mat;
attr_mat = (cv::Mat_<float>(2, 3) << 0, 1, 2, 3, 4, 5, 6);
if (!h5io->atexists(attr_mat_name))
h5io->atwrite(attr_mat, attr_mat_name);
String attr_str_name = "string attribute";
String attr_str = "Hello HDF5 from OpenCV!";
if (!h5io->atexists(attr_str_name))
h5io->atwrite(attr_str, attr_str_name);
String attr_int_name = "int attribute";
int attr_int = 123456;
if (!h5io->atexists(attr_int_name))
h5io->atwrite(attr_int, attr_int_name);
字符串 attr_double_name = "double attribute";
double attr_double = 45678.123;
如果 (!h5io->atexists(attr_double_name))
h5io->atwrite(attr_double, attr_double_name);
// 读取属性
expected_attr_mat;
int expected_attr_int;
double expected_attr_double;
字符串 expected_attr_str;
h5io->atread(&expected_attr_str, attr_str_name);
h5io->atread(expected_attr_mat, attr_mat_name);
h5io->atread(&expected_attr_int, attr_int_name);
h5io->atread(&expected_attr_double, attr_double_name);
// 检查结果
CV_Assert(norm(attr_mat - expected_attr_mat) < 1e-10);
CV_Assert(attr_str.compare(expected_attr_str) == 0);
CV_Assert(attr_int == expected_attr_int);
CV_Assert(fabs(attr_double - expected_attr_double) < 1e-10);
h5io->close();
}
int main()
{
read_write_attributes();
返回 0;
}
Mat 派生出来的模板矩阵类。
定义 mat.hpp:2230
n 维稠密阵列类
定义 mat.hpp:812
std::string 字符串
定义 cvstd.hpp:151
std::shared_ptr< _Tp > 指针
定义 cvstd_wrapper.hpp:23
#define CV_Assert(expr)
运行时检查一个条件,如果失败则抛出异常。
定义 base.hpp:342
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
与磁盘上的一个文件相关联的文件存储的“黑匣子”表现形式。
定义 core.hpp:102

说明

第一步是打开 HDF5 文件

Ptr<hdf::HDF5> h5io = hdf::open(filename);

然后,我们使用 cv::hdf::HDF5::atwrite() 通过指定值和名称来写入属性

String attr_mat_name = "array attribute";
Mat attr_mat;
attr_mat = (cv::Mat_<float>(2, 3) << 0, 1, 2, 3, 4, 5, 6);
if (!h5io->atexists(attr_mat_name))
h5io->atwrite(attr_mat, attr_mat_name);
警告
在写入属性之前,我们必须确保属性不存在,可以使用 cv::hdf::HDF5::atexists()

要读取属性,我们使用 cv::hdf::HDF5::atread() 通过指定属性名称

h5io->atread(expected_attr_mat, attr_mat_name);

最后,我们必须关闭 HDF 文件

h5io->close();

结果

图 1 和图 2 给出了使用 HDFView 工具可视化的结果。

图 1:根组属性
图 2:详细属性信息