您好,这是我第一次使用 HDF5,我正在尝试使用手动创建的数据集创建数据库表。文件已创建并已部署,但是每次我尝试插入单个数据注册表(每次 cv::mat 为 1x6,因为我尝试插入整个数据集但我也无法插入)我收到以下消息:
H5Dwrite():文件选择+偏移不在范围内主要:数据空间次要:在抛出“H5::DataSetIException”实例后调用超出范围终止
我正在使用的代码如下
cv::Mat label;
int size = data.length()/n_features_objects;
size_t size_[2]={1,(hsize_t)n_features_objects};
hsize_t chunk[2]={1,(hsize_t)n_features_objects};
hsize_t max_size[2]={H5S_UNLIMITED,(hsize_t)n_features_objects};
H5::DSetCreatPropList prop;
prop.setChunk(2,chunk);
H5::DataSpace ds(2, size_,max_size);
H5::IntType datatype = H5::PredType::NATIVE_UINT64;
objects = labelFile.createDataSet(objects_name.toStdString(),datatype, ds,prop);
//get size of the dataset
H5::DataSpace ds = objects.getSpace();
int dims = ds.getSimpleExtentNdims();
hsize_t rc [dims];
ds.getSimpleExtentDims(rc);
int rows = (int)rc[0];
for(int z=0; z<size;z++)
{
hsize_t new_size[2]={1, (hsize_t)n_features_objects};
labels.extend(new_size);
cv::Mat label_oreg = cv::Mat::zeros(cv::Size(n_features_objects,1), CV_32SC1);
//Adding data registries one by one
label_oreg.at<int>(0,0) = label_oreg.at<int>(z,0);
label_oreg.at<int>(0,1) = label_oreg.at<int>(z,1);
label_oreg.at<int>(0,2) = label_oreg.at<int>(z,2);
label_oreg.at<int>(0,3) = label_oreg.at<int>(z,3);
label_oreg.at<int>(0,4) = label_oreg.at<int>(z,4);
label_oreg.at<int>(0,5) = label_oreg.at<int>(z,5);
hsize_t rows_ext[2] ={1, (hsize_t)n_features_objects};
hsize_t offset[2] ={(hsize_t)1, 0};
ds = labels.getSpace();
ds.selectHyperslab(H5S_SELECT_SET,rows_ext, offset);
H5::DataSpace mem_space(2, rows_ext);
labels.write(label.data, H5::PredType::NATIVE_INT32, mem_space, ds);
}
有谁知道我在这里想念什么?我认为我的结果很奇怪,因为我总是在数据空间中注册了一块新的数据,以便将其用作放置注册表。