Loading...
Searching...
No Matches
Reading and Writing Attributes
Goal
This tutorial shows you:
- How to write attributes?
- How to read attributes?
- Note
- Although attributes can be associated with groups and datasets, only attributes with the root group are implemented in OpenCV. Supported attribute types are
int
,double
,cv::String
andcv::InputArray
(only for continuous arrays).
Source Code
The following code demonstrates reading and writing attributes inside the root group with data types cv::Mat
, cv::String
, int
and double
.
You can download the code from here or find it in the file modules/hdf/samples/read_write_attributes.cpp
of the opencv_contrib source code library.
#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);
String attr_double_name = "double attribute";
double attr_double = 45678.123;
if (!h5io->atexists(attr_double_name))
h5io->atwrite(attr_double, attr_double_name);
// read attributes
Mat expected_attr_mat;
int expected_attr_int;
double expected_attr_double;
String 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);
// check results
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();
return 0;
}
#define CV_Assert(expr)
Checks a condition at runtime and throws exception if it fails.
Definition: base.hpp:342
"black box" representation of the file storage associated with a file on disk.
Definition: core.hpp:106
Explanation
The first step is to open the HDF5 file:
Ptr<hdf::HDF5> h5io = hdf::open(filename);
Then we use cv::hdf::HDF5::atwrite() to write attributes by specifying its value and name:
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);
- Warning
- Before writing an attribute, we have to make sure that the attribute does not exist using cv::hdf::HDF5::atexists().
To read an attribute, we use cv::hdf::HDF5::atread() by specifying the attribute name
h5io->atread(expected_attr_mat, attr_mat_name);
In the end, we have to close the HDF file
h5io->close();
Results
Figure 1 and Figure 2 give the results visualized using the tool HDFView.