Goal 
This tutorial shows you:
- How to create a dataset?
- How to write a cv::Matto a dataset?
- How to read a cv::Matfrom a dataset?
- Note
- Currently, it supports only reading and writing cv::Mat and the matrix should be continuous in memory. Supports for other data types have not been implemented yet.
Source Code 
The following code demonstrates writing a single channel matrix and a two-channel matrix to datasets and then reading them back.
You can download the code from here or find it in the file modules/hdf/samples/create_read_write_datasets.cpp of the opencv_contrib source code library.
#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();
}
int main()
{
    write_root_group_single_channel();
    write_single_channel();
    write_multiple_channels();
    return 0;
}
Explanation 
The first step for creating a dataset is to open the file
 For the function write_root_group_single_channel(), since the dataset name is /single, which is inside the root group, we can use
    
    
    h5io->dswrite(data, dataset_name);
 to write the data directly to the dataset without the need of creating it beforehand. Because it is created inside cv::hdf::HDF5::dswrite() automatically.
- Warning
- This applies only to datasets that reside inside the root group.
Of course, we can create the dataset by ourselves:
    
    if (!h5io->hlexists(parent_name)) h5io->grcreate(parent_name);
    
    if (!h5io->hlexists(dataset_name)) h5io->dscreate(data.
rows, data.
cols, data.
type(), dataset_name);
  To read data from a dataset, we use
    Mat expected;
    h5io->dsread(expected, dataset_name);
 by specifying the name of the dataset.
We can check that the data read out is exactly the data written before by using
    double diff = 
norm(data - expected);
 Results 
Figure 1 shows the result visualized using the tool HDFView for the file root_group_single_channel. The results of matrices for datasets that are not the direct children of the root group are given in Figure 2 and Figure 3, respectively.
 
Figure 1: Result for writing a single channel matrix to a dataset inside the root group
 
 
 
Figure 2: Result for writing a single channel matrix to a dataset not in the root group
 
 
 
Figure 3: Result for writing a two-channel matrix to a dataset not in the root group