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

详细描述

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);
注意
属性**必须**存在,否则将调用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(),它允许在无限维度上增长,而不是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()

virtual 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 上的分块大小。

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

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

◆ dsgettype()

virtual 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]

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

◆ dsinsert() [2/4]

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

◆ dsinsert() [3/4]

virtual 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 倍。最终大小将为 500 行和 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:829

◆ dsinsert() [4/4]

virtual 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 容器
    // 读取希尔伯特数据集
    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 };
    // 读取希尔伯特数据集
    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 矩阵写入由两个 50x100 块优化的 100x100 压缩空间。矩阵使用偏移量写入数据的上半部分 (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()

virtual void cv::hdf::HDF5::grcreate ( const String & grlabel)
纯虚函数

创建一个组。

参数
grlabel指定 HDF5 组标签。

创建具有默认属性的 HDF5 组。组在创建后自动关闭。

注意
组有助于更好地组织多个数据集。可以在任何组内创建子组。可以使用 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 已创建,跳过。\n";
    // 注意,Group1 已在上面创建,否则会发生异常
    if (!h5io->hlexists("/Group1/SubGroup1"))
    h5io->grcreate("/Group1/SubGroup1");
    else
    std::cout << "/Group1/SubGroup1 已创建,跳过。\n";
    h5io->close();

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

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

◆ hlexists()

virtual 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 compresslevel = H5_NONE,
const int chunks = H5_NONE ) const
纯虚函数

cv::KeyPoint数据集创建和分配特殊的存储空间。

参数
大小声明固定数量的关键点。
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 的数据集需要 kpinsert(),它允许在无限维度上增长,而不是 kpwrite(),它只允许写入预定义的数据空间。

◆ 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 > 关键点,
const String & kplabel,
const int offset = H5_NONE,
const int counts = H5_NONE ) const
纯虚函数

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

参数
关键点指定要写入的关键点数据列表。
kplabel指定目标 HDF5 数据集标签。
偏移量指定数据集上关键点将被(覆盖)写入的位置的偏移量。
数量指定将写入数据集的关键点数量。

将 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:752

◆ kpread()

virtual void cv::hdf::HDF5::kpread ( vector< KeyPoint > & 关键点,
const String & kplabel,
const int offset = H5_NONE,
const int counts = H5_NONE ) const
纯虚函数

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

参数
关键点存储读取数据的 vector<KeyPoint> 容器。
kplabel指定源 HDF5 数据集标签。
偏移量指定从数据集开始读取的偏移位置。
数量指定要从数据集中读取的关键点数量。

读取反映存储数据集的 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();
  • 以下示例从第二个条目读取 3 个关键点。
    // 打开 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 > 关键点,
const String & kplabel,
const int offset = H5_NONE,
const int counts = H5_NONE ) const
纯虚函数

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

参数
关键点指定要写入的关键点数据列表。
kplabel指定目标 HDF5 数据集标签。
偏移量指定数据集上关键点将被(覆盖)写入的位置的偏移量。
数量指定将写入数据集的关键点数量。

将 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 个关键点集,并将其写入 100 个关键点的压缩空间中,该空间由 10 个块优化。相同的关键点集被写入三次,第一次写入前半部分 (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();

此类的文档是从以下文件生成的: