OpenCV  4.10.0
开源计算机视觉库
加载中...
搜索中...
没有匹配
公共类型 | 公共成员函数 | 所有成员列表

分层数据格式版本 5 接口。 更多信息...

#include <opencv2/hdf/hdf5.hpp>

cv::hdf::HDF5 的协作图

公共类型

枚举  {
  H5_UNLIMITED = -1 ,
  H5_NONE = -1 ,
  H5_GETDIMS = 100 ,
  H5_GETMAXDIMS = 101 ,
  H5_GETCHUNKDIMS = 102
}
 

公共成员函数

虚函数 ~HDF5 ()
 
virtual void atdelete (const String &atlabel)=0
 
virtual bool atexists (const String &atlabel) const =0
 
virtual void atread (double *value, const String &atlabel)=0
 
virtual void atread (int *value, const String &atlabel)=0
 
virtual void atread (OutputArray value, const String &atlabel)=0
 
virtual void atread (String *value, const String &atlabel)=0
 
virtual void atwrite (const double value, const String &atlabel)=0
 
virtual void atwrite (const int value, const String &atlabel)=0
 
virtual void atwrite (const String &value, const String &atlabel)=0
 
virtual void atwrite (InputArray value, const String &atlabel)=0
 
virtual void close ()=0
 关闭并释放 hdf5 对象。
 
virtual void dscreate (const int n_dims, const int *sizes, const int type, const String &dslabel) const =0
 
virtual void dscreate (const int n_dims, const int *sizes, const int type, const String &dslabel, const int compresslevel) const =0
 
virtual void dscreate (const int n_dims, const int *sizes, const int type, const String &dslabel, const int compresslevel, const int *dims_chunks) const =0
 创建并分配 n 维数据集的存储空间,单通道或多通道类型。
 
virtual void dscreate (const int rows, const int cols, const int type, const String &dslabel) const =0
 
virtual void dscreate (const int rows, const int cols, const int type, const String &dslabel, const int compresslevel) const =0
 
virtual void dscreate (const int rows, const int cols, const int type, const String &dslabel, const int compresslevel, const int *dims_chunks) const =0
 创建并分配二维单通道或多通道数据集的存储空间。
 
virtual void dscreate (const int rows, const int cols, const int type, const String &dslabel, const int compresslevel, const vector< int > &dims_chunks) const =0
 
virtual void dscreate (const vector< int > &sizes, const int type, const String &dslabel, const int compresslevel=HDF5::H5_NONE, const vector< int > &dims_chunks=vector< int >()) const =0
 
virtual vector< int > dsgetsize (const String &dslabel, int dims_flag=HDF5::H5_GETDIMS) const =0
 获取数据集大小。
 
virtual int dsgettype (const String &dslabel) const =0
 获取数据集类型。
 
virtual void dsinsert (InputArray Array, const String &dslabel) const =0
 
virtual void dsinsert (InputArray Array, const String &dslabel, const int *dims_offset) const =0
 
virtual void dsinsert (InputArray Array, const String &dslabel, const int *dims_offset, const int *dims_counts) const =0
 Mat对象插入指定数据集,如果允许unlimited属性,则自动扩展数据集大小。
 
virtual void dsinsert (InputArray Array, const String &dslabel, const vector< int > &dims_offset, const vector< int > &dims_counts=vector< int >()) const =0
 
virtual void dsread (OutputArray Array, const String &dslabel) const =0
 
virtual void dsread (OutputArray Array, const String &dslabel, const int *dims_offset) const =0
 
virtual void dsread (OutputArray Array, const String &dslabel, const int *dims_offset, const int *dims_counts) const =0
 从hdf5文件中读取特定数据集到Mat对象。
 
virtual void dsread (OutputArray Array, const String &dslabel, const vector< int > &dims_offset, const vector< int > &dims_counts=vector< int >()) const =0
 
virtual void dswrite (InputArray Array, const String &dslabel) const =0
 
virtual void dswrite (InputArray Array, const String &dslabel, const int *dims_offset) const =0
 
virtual void dswrite (InputArray Array, const String &dslabel, const int *dims_offset, const int *dims_counts) const =0
 Mat对象写入或覆盖到指定hdf5文件中的数据集。
 
virtual void dswrite (InputArray Array, const String &dslabel, const vector< int > &dims_offset, const vector< int > &dims_counts=vector< int >()) const =0
 
virtual void grcreate (const String &grlabel)=0
 创建一个组。
 
virtual bool hlexists (const String &label) const =0
 检查标签是否存在。
 
virtual void kpcreate (const int size, const String &kplabel, const int compresslevel=H5_NONE, const int chunks=H5_NONE) const =0
 cv::KeyPoint数据集创建并分配特殊存储。
 
virtual int kpgetsize (const String &kplabel, int dims_flag=HDF5::H5_GETDIMS) const =0
 获取特征点数据集的大小。
 
virtual void kpinsert (const vectorlt; KeyPoint > keypoints, const String &kplabel, const int offset=H5_NONE, const int counts=H5_NONE) const =0
 KeyPoint列表插入或覆盖到指定数据集,如果允许无限属性,则自动扩展数据集大小。
 
virtual void kpread (vector< KeyPoint > &keypoints, const String &kplabel, const int offset=H5_NONE, const int counts=H5_NONE) const =0
 从hdf5文件中读取特定关键点数据集到vector<KeyPoint>对象。
 
virtual void kpwrite (const vector< KeyPoint > keypoints, const String &kplabel, const int offset=H5_NONE, const int counts=H5_NONE) const =0
 KeyPoint列表写入或覆盖到hdf5文件的指定数据集。
 

详细描述

分层数据格式版本5接口。

请注意,此模块仅在正确安装hdf5时编译。

成员枚举文档

◆ 匿名枚举

匿名枚举
枚举器
H5_UNLIMITED 

维度大小无限。

另见
dscreate()
H5_NONE 

无压缩。

另见
dscreate()
H5_GETDIMS 

获取数据集的维度信息。

另见
dsgetsize()
H5_GETMAXDIMS 

获取数据集的最大维度信息。

另见
dsgetsize()
H5_GETCHUNKDIMS 

获取数据集的块大小。

另见
dsgetsize()

构造函数 & 析构函数文档

◆ ~HDF5()

virtual cv::hdf::HDF5::~HDF5 ( )
inlinevirtual

成员函数文档

◆ atdelete()

virtual void cv::hdf::HDF5::atdelete ( const String atlabel)
纯虚

从根组删除一个属性。

参数
atlabel要删除的属性。
注意
CV_Error()如果指定的属性不存在时将被调用。在删除之前使用atexists()检查是否存在。
另见
atexists, atwrite, atread

◆ atexists()

virtual bool cv::hdf::HDF5::atexists ( const String atlabel) const
纯虚

检查在根组中给定的属性是否存在。

参数
atlabel要检查的属性名称。
返回值
如果属性存在,返回true,否则返回false。
另见
atdelete, atwrite, atread

◆ atread() [1/4]

virtual void cv::hdf::HDF5::atread ( double *  value,
const String atlabel 
)
纯虚

这是一个为了方便而提供的重载成员函数。它与上述函数的区别在于它接受的参数。

◆ atread() [2/4]

virtual void cv::hdf::HDF5::atread ( int *  value,
const String atlabel 
)
纯虚

从根组读取一个属性。

参数
value将属性读入的地址
atlabel属性名称

以下示例演示了如何读取类型为 cv::String 的属性

String expected_attr_str;
h5io->atread(&expected_attr_str, attr_str_name);
std::string String
定义 cvstd.hpp:151
注意
该属性必须存在,否则将调用 CV_Error()。使用 atexists() 来提前检查其是否存在。
另见
atexists, atdelete, atwrite

◆ atread() [3/4]

virtual void cv::hdf::HDF5::atread ( OutputArray  value,
const String atlabel 
)
纯虚

从根组读取一个属性。

参数
value属性值。目前,仅支持 n 维连续多通道数组。
atlabel属性名称。
注意
该属性必须存在,否则将调用 CV_Error()。使用 atexists() 来提前检查其是否存在。
另见
atexists, atdelete, atwrite

◆ atread() [4/4]

virtual void cv::hdf::HDF5::atread ( String value,
const String atlabel 
)
纯虚

这是一个为了方便而提供的重载成员函数。它与上述函数的区别在于它接受的参数。

◆ atwrite() [1/4]

virtual void cv::hdf::HDF5::atwrite ( const double  value,
const String atlabel 
)
纯虚

这是一个为了方便而提供的重载成员函数。它与上述函数的区别在于它接受的参数。

◆ atwrite() [2/4]

virtual void cv::hdf::HDF5::atwrite ( const int  value,
const String atlabel 
)
纯虚

在根组内部写入一个属性。

参数
value属性值。
atlabel属性名称。

以下示例演示了如何写入类型为 cv::String 的属性

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);
注意
CV_Error() 会被调用,如果给定的属性已经存在。使用 atexists() 来提前检查它是否存在或不存在。并且使用 atdelete() 来删除它,如果它已经存在。
另见
atexists, atdelete, atread

◆ atwrite() [3/4]

virtual void cv::hdf::HDF5::atwrite ( const String value,
const String atlabel 
)
纯虚

这是一个为了方便而提供的重载成员函数。它与上述函数的区别在于它接受的参数。

◆ atwrite() [4/4]

virtual void cv::hdf::HDF5::atwrite ( InputArray  value,
const String atlabel 
)
纯虚

将属性写入根组。

参数
value属性值。目前,仅支持 n 维连续多通道数组。
atlabel属性名称。
注意
CV_Error() 会被调用,如果给定的属性已经存在。使用 atexists() 来提前检查它是否存在或不存在。并且使用 atdelete() 来删除它,如果它已经存在。
另见
atexists, atdelete, atread.

◆ close()

virtual void cv::hdf::HDF5::close ( )
纯虚

关闭并释放 hdf5 对象。

◆ dscreate() [1/8]

virtual void cv::hdf::HDF5::dscreate ( const int  n_dims,
const int *  sizes,
const int  type,
const String dslabel 
) const
纯虚

◆ dscreate() [2/8]

virtual void cv::hdf::HDF5::dscreate ( const int  n_dims,
const int *  sizes,
const int  type,
const String dslabel,
const int  compresslevel 
) const
纯虚

◆ dscreate() [3/8]

virtual void cv::hdf::HDF5::dscreate ( const int  n_dims,
const int *  sizes,
const int  type,
const String dslabel,
const int  compresslevel,
const int *  dims_chunks 
) const
纯虚

创建并分配 n 维数据集的存储空间,单通道或多通道类型。

参数
n_dims声明维度数量
sizes包含每个维度大小的数组
type要使用的类型,例如,CV_8UC3,CV_32FC1,等。
dslabel指定hdf5数据集标签。现有的数据集标签将导致错误。
compresslevel指定要使用的压缩级别 0-9,H5_NONE 是默认值,表示不压缩。值 0 也表示不压缩。值 9 表示最佳的压缩比例。请注意,较高的压缩级别意味着较高的计算成本。它依赖于 GNU gzip 进行压缩。
dims_chunks每个数组成员指定用于块 I/O 的分块大小,默认为 NULL 表示一个都没有。
注意
如果数据集已经存在,将抛出一个异常。可以使用 hlexists() 检查数据集是否存在。
  • 下面是一个示例,创建一个 6 维度的存储空间。
    // 打开或创建 hdf5 文件
    cv::Ptr<cv::hdf::HDF5> h5io = cv::hdf::open( "mytest.h5" );
    // 创建 6 维 CV_64FC2 矩阵的存储空间
    if ( ! h5io->hlexists( "nddata" ) )
    int n_dims = 5;
    int dsdims[n_dims] = { 100, 100, 20, 10, 5, 5 };
    h5io->dscreate( n_dims, sizes, CV_64FC2, "nddata" );
    else
    printf("DS already created, skipping\n" );
    // 释放
    h5io->close();
    std::shared_ptr< _Tp > Ptr
    定义 cvstd_wrapper.hpp:23
    #define CV_64FC2
    定义 interface.h:125
    Ptr< HDF5 > open(const String &HDF5Filename)
    打开或创建 hdf5 文件。
注意
启用压缩需要内部分块。分块可以在读取和写入时显著提高访问速度,特别是对于移动数据集内部偏移的窗口访问逻辑。如果没有指定自定义分块,将使用数据集大小的默认单个大块数据。
  • 以下是一个使用分块进行级 0 压缩(浅)并对第一个维度进行分块的示例,因此存储将包含 100 个数据块。
    // 打开或创建 hdf5 文件
    cv::Ptr<cv::hdf::HDF5> h5io = cv::hdf::open( "mytest.h5" );
    // 创建 6 维 CV_64FC2 矩阵的存储空间
    if ( ! h5io->hlexists( "nddata" ) )
    int n_dims = 5;
    int dsdims[n_dims] = { 100, 100, 20, 10, 5, 5 };
    int chunks[n_dims] = { 1, 100, 20, 10, 5, 5 };
    h5io->dscreate( n_dims, dsdims, CV_64FC2, "nddata", 0, chunks );
    else
    printf("DS already created, skipping\n" );
    // 释放
    h5io->close();
注意
sizes 数组中,H5_UNLIMITED 的值表示该维度的数据是无限大的,因此可以随时在无限方向上扩展这样的数据集。在任何维度存在 H5_UNLIMITED 要求**定义自定义分块。在不限量场景下不会定义默认分块,因为该维度的默认大小将为零,并且将在数据集写入后增长。要将数据写入有某些维度包含 H5_UNLIMITED 的数据集,需要使用 dsinsert() 而不是 dswrite(),后者允许在无限维度上写入数据。

◆ dscreate() [4/8]

virtual void cv::hdf::HDF5::dscreate ( const int  rows,
const int  cols,
const int  type,
const String dslabel 
) const
纯虚

这是一个为了方便而提供的重载成员函数。它与上述函数的区别在于它接受的参数。

◆ dscreate() [5/8]

virtual void cv::hdf::HDF5::dscreate ( const int  rows,
const int  cols,
const int  type,
const String dslabel,
const int  compresslevel 
) const
纯虚

这是一个为了方便而提供的重载成员函数。它与上述函数的区别在于它接受的参数。

◆ dscreate() [6/8]

virtual void cv::hdf::HDF5::dscreate ( const int  rows,
const int  cols,
const int  type,
const String dslabel,
const int  compresslevel,
const int *  dims_chunks 
) const
纯虚

创建并分配二维单通道或多通道数据集的存储空间。

参数
rows声明行数
cols声明列数
type要使用的数据类型,例如 CV_8UC3, CV_32FC1 等。
dslabel指定hdf5数据集标签。现有的数据集标签将导致错误。
compresslevel指定要使用的压缩级别 0-9,H5_NONE 是默认值,表示不压缩。值 0 也表示不压缩。值 9 表示最佳的压缩比例。请注意,较高的压缩级别意味着较高的计算成本。它依赖于 GNU gzip 进行压缩。
dims_chunks每个数组成员指定用于块I/O的块大小,默认为NULL表示一个都没有。
注意
如果数据集已存在,将抛出异常(调用 CV_Error())。
  • 可以使用 hlexists() 检查数据集是否存在,如本示例所示。
    // 打开或创建 hdf5 文件
    cv::Ptr<cv::hdf::HDF5> h5io = cv::hdf::open( "mytest.h5" );
    // 创建100x50 CV_64FC2矩阵的空间
    if ( ! h5io->hlexists( "hilbert" ) )
    h5io->dscreate( 100, 50, CV_64FC2, "hilbert" );
    else
    printf("DS already created, skipping\n" );
    // 释放
    h5io->close();
注意
开启压缩需要内部块处理。块处理可以显著提高读写时的访问速度,尤其是在数据集内部的偏移发生窗口访问逻辑位移时。如果没有指定自定义块处理,默认块处理将被调用,作为单一大块数据。
  • 请参见使用内部默认块处理的第9级压缩示例
    // 打开或创建 hdf5 文件
    cv::Ptr<cv::hdf::HDF5> h5io = cv::hdf::open( "mytest.h5" );
    // 为CV_64FC2矩阵创建第9级压缩空间
    if ( ! h5io->hlexists( "hilbert", 9 ) )
    h5io->dscreate( 100, 50, CV_64FC2, "hilbert", 9 );
    else
    printf("DS already created, skipping\n" );
    // 释放
    h5io->close();
注意
如果行或列或两者都是 H5_UNLIMITED 的值表示指定维度的无限数据,因此可以随时在行、列或两个方向上扩展此类数据集。任何维度上的 H5_UNLIMITED 的存在都要求定义自定义块处理。在无限场景中不会定义默认的块处理,因为在那个维度上的默认大小为零,并且会在写入数据集后增长。向具有某些维度为 H5_UNLIMITED 的数据集写入数据要求使用 dsinsert(),它允许在无限维度上增长,而不是使用 dswrite(),它只允许在预定义的数据空间中写入。
注意
它是非线程安全的,必须在数据集创建时只调用一次,否则将发生异常。单个HDF5文件内允许多个数据集。

◆ dscreate() [7/8]

virtual void cv::hdf::HDF5::dscreate ( const int  rows,
const int  cols,
const int  type,
const String dslabel,
const int  compresslevel,
const vector< int > &  dims_chunks 
) const
纯虚

这是一个为了方便而提供的重载成员函数。它与上述函数的区别在于它接受的参数。

◆ dscreate() [8/8]

virtual void cv::hdf::HDF5::dscreate ( const vector< int > &  sizes,
const int  type,
const String dslabel,
const int  compresslevel = HDF5::H5_NONE,
const vector< int > &  dims_chunks = vector< int >() 
) const
纯虚

◆ dsgetsize()

虚拟 vector< int > cv::hdf::HDF5::dsgetsize ( const String dslabel,
int  dims_flag = HDF5::H5_GETDIMS 
) const
纯虚

获取数据集大小。

参数
dslabel指定要测量的hdf5数据集的标签。
dims_flag将在H5_GETDIMS,数据集最大维度H5_GETMAXDIMS和分块尺寸H5_GETCHUNKDIMS上获取数据集维度。

返回包含数据集每个维度大小的vector对象。

注意
返回的vector大小将匹配数据集维度的数量。默认情况下,H5_GETDIMS将返回实际数据集维度。使用H5_GETMAXDIM标志将获取允许的最大维度,这通常与实际数据集维度匹配,但可以在一些维度上以无限模式准备数据集时具有H5_UNLIMITED值。在覆盖整个或部分数据集之前检查现有数据集维度可能很有用。尝试将过大源数据写入数据集目标将抛出异常。如果数据集以分块选项创建,H5_GETCHUNKDIMS将返回分块的维度,否则返回的vector大小将为零。

◆ dsgettype()

虚拟 int cv::hdf::HDF5::dsgettype ( const String dslabel) const
纯虚

获取数据集类型。

参数
dslabel指定要检查的hdf5数据集标签。

返回存储的矩阵类型。这是一个与CvMat类型系统兼容的标识符,例如,CV_16SC5(16位有符号5通道数组)等。

注意
结果可以用CV_MAT_CN()解析以获取通道数量,用CV_MAT_DEPTH()获取原生cvdata类型。它是线程安全的。

◆ dsinsert() [1/4]

虚拟 void cv::hdf::HDF5::dsinsert ( InputArray  数组,
const String dslabel 
) const
纯虚

◆ dsinsert() [2/4]

虚拟 void cv::hdf::HDF5::dsinsert ( InputArray  数组,
const String dslabel,
const int *  dims_offset 
) const
纯虚

◆ dsinsert() [3/4]

虚拟 void cv::hdf::HDF5::dsinsert ( InputArray  数组,
const String dslabel,
const int *  dims_offset,
const int *  dims_counts 
) const
纯虚

Mat对象插入指定数据集,如果允许unlimited属性,则自动扩展数据集大小。

参数
数组指定要写入的Mat数据数组。
dslabel指定目标hdf5数据集的标签。
dims_offset每个数组成员指定InputArray写入数据集时从数据集中的每个维度开始的偏移位置。
dims_counts每个数组成员指定从InputArray写入数据集的数据量,数据量是数据集的每个维度。

Mat对象写入目标数据集,并允许时自动扩展数据集维度。

注意
dswrite()不同,数据集不是自动创建的。只支持Mat,并且必须是连续的。如果dsinsert()发生在数据集维度的外部区域,并且在该维度上数据集处于无限模式,那么数据集将被扩展,否则将抛出异常。要创建具有特定或更多维度无限属性的数据集,请参阅dscreate()和在创建时可选的H5_UNLIMITED标志。它不是在同一数据集上线程安全的,但可以在单个hdf5文件内合并多个数据集。
  • 以下示例创建无限行x 100列,并使用单个100x100 CV_64FC2在数据集上使用dsinsert()将行扩展5次。最终大小将具有5x100行和100列,反映在行跨度上H矩阵的五次。块大小为100x100,仅针对H矩阵大小进行了优化,压缩已禁用。如果多次调用程序,数据集将被覆盖。
    // 双通道希尔伯特矩阵
    cv::Mat H(50, 100, CV_64FC2);
    for(int i = 0; i < H.rows; i++)
    for(int j = 0; j < H.cols; j++)
    {
    H.at<cv::Vec2d>(i,j)[0] = 1./(i+j+1);
    H.at<cv::Vec2d>(i,j)[1] = -1./(i+j+1);
    count++;
    }
    // 打开或创建 hdf5 文件
    cv::Ptr<cv::hdf::HDF5> h5io = cv::hdf::open( "mytest.h5" );
    // 通过块优化数据集
    int chunks[2] = { 100, 100 };
    // 创建无限 x 100 CV_64FC2 空间
    h5io->dscreate( cv::hdf::HDF5::H5_UNLIMITED, 100, CV_64FC2, "hilbert", cv::hdf::HDF5::H5_NONE, chunks );
    // 写入前半部分
    int offset[2] = { 0, 0 };
    for ( int t = 0; t < 5; t++ )
    {
    offset[0] += 100 * t;
    h5io->dsinsert( H, "hilbert", offset );
    }
    // 释放
    h5io->close();
    n维密集数组类
    定义 mat.hpp:812

◆ dsinsert() [4/4]

虚拟 void cv::hdf::HDF5::dsinsert ( InputArray  数组,
const String dslabel,
const vector< int > &  dims_offset,
const vector< int > &  dims_counts = vector< int >() 
) const
纯虚

◆ dsread() [1/4]

virtual void cv::hdf::HDF5::dsread ( OutputArray  数组,
const String dslabel 
) const
纯虚

◆ dsread() [2/4]

virtual void cv::hdf::HDF5::dsread ( OutputArray  数组,
const String dslabel,
const int *  dims_offset 
) const
纯虚

◆ dsread() [3/4]

virtual void cv::hdf::HDF5::dsread ( OutputArray  数组,
const String dslabel,
const int *  dims_offset,
const int *  dims_counts 
) const
纯虚

从hdf5文件中读取特定数据集到Mat对象。

参数
数组Mat 容器,其中将返回读取的数据。
dslabel指定源 hdf5 数据集标签。
dims_offset每个数组成员指定从数据集起始位置到 OutputArray 的每个维度的偏移量。
dims_counts每个数组成员指定要将数据读取到 OutputArray 的数据集的每个维度的数量。

读取出反映存储数据集的 Mat 对象。

注意
如果 hdf5 文件不存在,将抛出异常。使用 hlexists() 检查数据集是否存在。它是线程安全的。
  • 以下示例读取数据集
    // 打开 hdf5 文件
    cv::Ptr<cv::hdf::HDF5> h5io = cv::hdf::open( "mytest.h5" );
    // 空的 Mat 容器
    // 读取 hilbert 数据集
    h5io->read( H, "hilbert" );
    // 释放
    h5io->close();
  • 以下示例从第二行第三列执行 3x5 子矩阵的读取。
    // 打开 hdf5 文件
    cv::Ptr<cv::hdf::HDF5> h5io = cv::hdf::open( "mytest.h5" );
    // 空的 Mat 容器
    int offset[2] = { 1, 2 };
    int counts[2] = { 3, 5 };
    // 读取 hilbert 数据集
    h5io->read( H, "hilbert", offset, counts );
    // 释放
    h5io->close();

◆ dsread() [4/4]

virtual void cv::hdf::HDF5::dsread ( OutputArray  数组,
const String dslabel,
const vector< int > &  dims_offset,
const vector< int > &  dims_counts = vector< int >() 
) const
纯虚

◆ dswrite() [1/4]

virtual void cv::hdf::HDF5::dswrite ( InputArray  数组,
const String dslabel 
) const
纯虚

◆ dswrite() [2/4]

virtual void cv::hdf::HDF5::dswrite ( InputArray  数组,
const String dslabel,
const int *  dims_offset 
) const
纯虚

◆ dswrite() [3/4]

virtual void cv::hdf::HDF5::dswrite ( InputArray  数组,
const String dslabel,
const int *  dims_offset,
const int *  dims_counts 
) const
纯虚

Mat对象写入或覆盖到指定hdf5文件中的数据集。

参数
数组指定要写入的Mat数据数组。
dslabel指定目标hdf5数据集的标签。
dims_offset每个数组成员指定InputArray写入数据集时从数据集中的每个维度开始的偏移位置。
dims_counts每个数组成员指定要从 InputArray 写入到数据集的每个维度的数据量。

Mat 对象写入目标数据集。

注意
如果数据集未创建且不存在,它将自动创建。仅支持Mat,并且必须连续。它是线程安全的,但建议通过不同的非重叠区域进行写入。单个HDF5文件中可以写入多个数据集。
  • 下面的示例将一个100x100的CV_64FC2矩阵写入数据集。无需预先创建数据集。如果调用该过程多次,数据集将被重复覆盖
    // 双通道希尔伯特矩阵
    cv::Mat H(100, 100, CV_64FC2);
    for(int i = 0; i < H.rows; i++)
    for(int j = 0; j < H.cols; j++)
    {
    H.at<cv::Vec2d>(i,j)[0] = 1./(i+j+1);
    H.at<cv::Vec2d>(i,j)[1] = -1./(i+j+1);
    count++;
    }
    // 打开或创建 hdf5 文件
    cv::Ptr<cv::hdf::HDF5> h5io = cv::hdf::open( "mytest.h5" );
    // 写入/覆盖数据集
    h5io->dswrite( H, "hilbert" );
    // 释放
    h5io->close();
  • 下面的示例将较小的50x100矩阵写入100x100压缩空间,该空间通过两个50x100块进行优化。矩阵使用偏移写入数据空间的第一半(0->50)和第二半(50->100)。
    // 双通道希尔伯特矩阵
    cv::Mat H(50, 100, CV_64FC2);
    for(int i = 0; i < H.rows; i++)
    for(int j = 0; j < H.cols; j++)
    {
    H.at<cv::Vec2d>(i,j)[0] = 1./(i+j+1);
    H.at<cv::Vec2d>(i,j)[1] = -1./(i+j+1);
    count++;
    }
    // 打开或创建 hdf5 文件
    cv::Ptr<cv::hdf::HDF5> h5io = cv::hdf::open( "mytest.h5" );
    // 通过两个块优化数据集
    int chunks[2] = { 50, 100 };
    // 创建100x100 CV_64FC2压缩空间
    h5io->dscreate( 100, 100, CV_64FC2, "hilbert", 9, chunks );
    // 写入前半部分
    int offset1[2] = { 0, 0 };
    h5io->dswrite( H, "hilbert", offset1 );
    // 写入第二半
    int offset2[2] = { 50, 0 };
    h5io->dswrite( H, "hilbert", offset2 );
    // 释放
    h5io->close();

◆ dswrite() [4/4]

virtual void cv::hdf::HDF5::dswrite ( InputArray  数组,
const String dslabel,
const vector< int > &  dims_offset,
const vector< int > &  dims_counts = vector< int >() 
) const
纯虚

◆ grcreate()

虚拟函数 cv::hdf::HDF5::grcreate ( const String grlabel)
纯虚

创建一个组。

参数
grlabel指定hdf5组标签。

创建具有默认属性的低5组。创建后,组将自动关闭。

注意
组对于更好地组织多个数据集非常有用。可以在任意组内部创建子组。可以使用hlexists()来检查特定组的存在。对于子组,标签可能是例如:"Group1/SubGroup1",其中SubGroup1位于根组Group1中。在创建子组之前,其父组必须创建。
  • 在这个例子中,Group1将有一个名为SubGroup1的子组

    Ptr<hdf::HDF5> h5io = hdf::open("mytest.h5");
    // "/" 表示根组,它始终存在
    if (!h5io->hlexists("/Group1"))
    h5io->grcreate("/Group1");
    else
    std::cout << "/Group1 has already been created, skip it.\n";
    // 注意,已在上文中创建Group1,否则将发生异常
    if (!h5io->hlexists("/Group1/SubGroup1"))
    h5io->grcreate("/Group1/SubGroup1");
    else
    std::cout << "/Group1/SubGroup1 has already been created, skip it.\n";
    h5io->close();

    使用HDFView工具可视化相应的结果

使用HDFView工具可视化组
注意
当使用dscreate()kpcreate()创建数据集时,可以通过在标签内指定完整路径在组内创建。在我们的例子中,它将是:"Group1/SubGroup1/MyDataSet"。它不是线程安全的。

◆ hlexists()

bool cv::hdf::HDF5::hlexists ( const String 标签) const
纯虚

检查标签是否存在。

参数
标签指定hdf5数据集的标签。

如果数据集存在则返回true,否则返回false

注意
检查在指定标签名称下是否存在数据集、组或其他对象类型(hdf5链接)。它是线程安全的。

◆ kpcreate()

virtual void cv::hdf::HDF5::kpcreate ( const int  大小,
const String kplabel,
const int  压缩级别 = H5_NONE,
const int  = H5_NONE 
) const
纯虚

cv::KeyPoint数据集创建并分配特殊存储。

参数
大小声明固定数量的KeyPoints
kplabel指定hdf5数据集的标签,如果有带有相同标签存在的数据集,将会被覆盖。
compresslevel指定要使用的压缩级别0-9,H5_NONE是默认值,表示不压缩。
每个数组成员指定用于块I/O的块大小,H5_NONE是默认值,表示不压缩。
注意
如果数据集已经存在,将会抛出异常。可以使用hlexists()来检查数据集的存在。
  • 以下是一个示例,用于在数据集中创建100个关键点的空间
    // 打开 hdf5 文件
    cv::Ptr<cv::hdf::HDF5> h5io = cv::hdf::open( "mytest.h5" );
    if ( ! h5io->hlexists( "keypoints" ) )
    h5io->kpcreate( 100, "keypoints" );
    else
    printf("DS already created, skipping\n" );
注意
size的值为H5_UNLIMITED表示无限关键点,因此可以在任何时候通过添加或插入来扩展此类数据集。H5_UNLIMITED的存在需要定义自定义块大小。在无限场景中不会定义默认的块大小,因为该维度的默认大小为零,大小将在数据集写入时增长。将超出大小限制的源数据写入具有某些维度为H5_UNLIMITED的数据集将抛出异常。H5_GETCHUNKDIMS将返回块的维度,如果数据集使用块选项创建,否则返回的向量大小将为零。

◆ kpgetsize()

virtual int cv::hdf::HDF5::kpgetsize ( const String kplabel,
int  dims_flag = HDF5::H5_GETDIMS 
) const
纯虚

获取特征点数据集的大小。

参数
kplabel指定要测量的hdf5数据集的标签。
dims_flag将检索H5_GETDIMS上的数据集维度,以及H5_GETMAXDIMS上的数据集最大维度。

返回关键点数据集的大小。

注意
结果大小将匹配关键点数量。默认情况下,H5_GETDIMS将返回实际的数据集维度。使用H5_GETMAXDIM标志将获取允许的最大维度,这通常与实际数据集维度相匹配,但如果数据集在无限模式下准备,则可以持有H5_UNLIMITED值。在覆盖整个数据集或其子集之前检查现有数据集的维度可能很有用。尝试将超尺寸的源数据写入目标数据集将抛出异常。H5_GETCHUNKDIMS将返回块的维度,如果数据集使用块选项创建,否则返回的向量大小将为零。

◆ kpinsert()

virtual void cv::hdf::HDF5::kpinsert ( const vector< KeyPoint keypoints,
const String kplabel,
const int  偏移量 = H5_NONE,
const int  counts = H5_NONE 
) const
纯虚

KeyPoint列表插入或覆盖到指定数据集,如果允许无限属性,则自动扩展数据集大小。

参数
keypoints指定要写入的关键点数据列表。
kplabel指定目标hdf5数据集的标签。
偏移量指定在数据集上从何处将关键点(覆盖)写入(的数据集)的位置。
counts指定将写入数据集的关键点数量。

将 vector<KeyPoint> 对象写入目标数据集,并允许时自动扩展数据集维度。

注意
kpwrite() 不同,数据集不是自动创建的。如果在数据集的外部区域发生 dsinsert(),并且数据集已在 无限制 模式下创建,则数据集会扩展,否则会引发异常。要创建具有 无限制 属性的数据集,请参阅 kpcreate() 和创建时的可选 H5_UNLIMITED 标志。这不是在相同数据集上线程安全的,但可以在单个 hdf5 文件内合并多个数据集。
  • 下面的示例创建用于关键点存储的无限制空间,并将包含 10 个关键点的列表插入该空间 10 次。最终数据集将有 100 个关键点。块大小为 10,仅针对关键点列表进行了优化。如果例行程序被多次调用,则数据集将被覆盖
    // 生成 10 个虚拟关键点
    std::vector<cv::KeyPoint> keypoints;
    for(int i = 0; i < 10; i++)
    keypoints.push_back( cv::KeyPoint(i, -i, 1, -1, 0, 0, -1) );
    // 打开或创建 hdf5 文件
    cv::Ptr<cv::hdf::HDF5> h5io = cv::hdf::open( "mytest.h5" );
    // 创建块大小为 10 的无限制大小的空间
    h5io->kpcreate( cv::hdf::HDF5::H5_UNLIMITED, "keypoints", -1, 10 );
    // 插入 10 次相同的 10 个关键点
    for(int i = 0; i < 10; i++)
    h5io->kpinsert( keypoints, "keypoints", i * 10 );
    // 释放
    h5io->close();
    突出点检测器的数据结构。
    定义 types.hpp:745

◆ kpread()

virtual void cv::hdf::HDF5::kpread ( vector< cv::KeyPoint > &  keypoints,
const String kplabel,
const int  偏移量 = H5_NONE,
const int  counts = H5_NONE 
) const
纯虚

从hdf5文件中读取特定关键点数据集到vector<KeyPoint>对象。

参数
keypointsvector<KeyPoint> 容器,其中数据将返回。
kplabel指定源 hdf5 数据集标签。
偏移量指定从数据集开始的读取偏移量。
counts指定要从数据集读取的关键点数量。

读取 reflect storing dataset 的 vector<KeyPoint> 对象。

注意
如果 hdf5 文件不存在,将抛出异常。使用 hlexists() 检查数据集是否存在。它是线程安全的。
  • 下面的示例从第二个条目读取包含关键点的数据集
    // 打开 hdf5 文件
    cv::Ptr<cv::hdf::HDF5> h5io = cv::hdf::open( "mytest.h5" );
    // 空关键点容器
    std::vector<cv::KeyPoint> keypoints;
    // 从第二个关键点开始读取关键点
    h5io->kpread( keypoints, "keypoints", 1 );
    // 释放
    h5io->close();
  • 下面的示例从第二个条目读取三个关键点。
    // 打开 hdf5 文件
    cv::Ptr<cv::hdf::HDF5> h5io = cv::hdf::open( "mytest.h5" );
    // 空关键点容器
    std::vector<cv::KeyPoint> keypoints;
    // 从第二个关键点开始读取三个关键点
    h5io->kpread( keypoints, "keypoints", 1, 3 );
    // 释放
    h5io->close();

◆ kpwrite()

virtual void cv::hdf::HDF5::kpwrite ( const vector< KeyPoint keypoints,
const String kplabel,
const int  偏移量 = H5_NONE,
const int  counts = H5_NONE 
) const
纯虚

KeyPoint列表写入或覆盖到hdf5文件的指定数据集。

参数
keypoints指定要写入的关键点数据列表。
kplabel指定目标hdf5数据集的标签。
偏移量指定在数据集上从何处将关键点(覆盖)写入(的数据集)的位置。
counts指定将写入数据集的关键点数量。

将 vector<KeyPoint> 对象写入目标数据集。

注意
如果数据集不存在,将自动创建。它是线程安全的,但建议写入发生在非重叠的不同区域。可以在单个 hdf5 文件中写入多个数据集。
  • 下面的示例将 100 个关键点写入数据集。无需预先创建数据集。如果例行程序被多次调用,数据集将被覆盖
    // 生成 100 个虚拟关键点
    std::vector<cv::KeyPoint> keypoints;
    for(int i = 0; i < 100; i++)
    keypoints.push_back( cv::KeyPoint(i, -i, 1, -1, 0, 0, -1) );
    // 打开或创建 hdf5 文件
    cv::Ptr<cv::hdf::HDF5> h5io = cv::hdf::open( "mytest.h5" );
    // 写入/覆盖数据集
    h5io->kpwrite( keypoints, "keypoints" );
    // 释放
    h5io->close();
  • 以下示例使用较小的50个关键点集合,并写入由10个块优化的100个关键点压缩空间。相同的特征点集合被写入三次,首先写入第一部分(0-50),然后写入第二部分(50-75),最后写入数据空间剩余的空间(75-99),使用偏移量和计数参数设置写访问窗口。如果程序多次调用,数据集将被覆盖
    生成50个虚拟关键点
    std::vector<cv::KeyPoint> keypoints;
    for(int i = 0; i < 50; i++)
    keypoints.push_back( cv::KeyPoint(i, -i, 1, -1, 0, 0, -1) );
    // 打开或创建 hdf5 文件
    cv::Ptr<cv::hdf::HDF5> h5io = cv::hdf::open( "mytest.h5" );
    创建最大压缩空间大小为100,块大小为10
    h5io->kpcreate( 100, "keypoints", 9, 10 );
    // 写入前半部分
    h5io->kpwrite( keypoints, "keypoints", 0 );
    将前25个关键点写入第二部分
    h5io->kpwrite( keypoints, "keypoints", 50, 25 );
    将前25个关键点写入第二部分的剩余空间
    h5io->kpwrite( keypoints, "keypoints", 75, 25 );
    // 释放
    h5io->close();

本类文档是从以下文件生成的