OpenCV  4.5.1
Open Source Computer Vision
Reading and Writing Attributes

Goal

This tutorial shows you:

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 and cv::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;
}

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.

attributes-file.png
Figure 1: Attributes of the root group
attributes-details.png
Figure 2: Detailed attribute information