OpenCV  4.10.0-dev
Open Source Computer Vision
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 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;
}
Template matrix class derived from Mat.
Definition mat.hpp:2246
n-dimensional dense array class
Definition mat.hpp:828
std::string String
Definition cvstd.hpp:151
std::shared_ptr< _Tp > Ptr
Definition cvstd_wrapper.hpp:23
#define CV_Assert(expr)
Checks a condition at runtime and throws exception if it fails.
Definition base.hpp:359
int main(int argc, char *argv[])
Definition highgui_qt.cpp:3
Definition core.hpp:107

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.

Figure 1: Attributes of the root group
Figure 2: Detailed attribute information