我正在尝试使用HDFql将图像从 OpenCV 保存到 HDF5 。这是我要实现的目标的一个最小示例(假设您在 有图像/tmp/lena.jpg):
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <HDFql.hpp>
int main() {
char script[1024];
HDFql::execute("CREATE FILE /tmp/test.h5");
HDFql::execute("USE FILE /tmp/test.h5");
HDFql::execute("CREATE GROUP image");
cv::Mat img = cv::imread("/tmp/lena.jpg", CV_8UC3);
cv::Size size(img.size());
std::cout << "Size = " << size.width << ", " << size.height;
for(int i=0; i<100; i++)
{
// Show a few pixel values - cast is necessary, since values are unsigned char
std::cout << i << ": " << (int)img.data[i] << std::endl;
}
sprintf(script, "CREATE CONTIGUOUS DATASET test/image AS UNSIGNED TINYINT(%d)", size.width*size.height*3);
HDFql::execute(script);
sprintf(script, "INSERT INTO test/image VALUES FROM MEMORY %d", HDFql::variableRegister(img.data));
HDFql::execute("CLOSE FILE");
HDFql::execute("USE FILE /tmp/test.h5");
cv::Mat img_loaded = cv::Mat::zeros(cv::Size(size.width, size.height), CV_8UC3);
HDFql::variableRegister(img_loaded.data);
HDFql::execute("SELECT AS INT FROM image VALUES INTO MEMORY " + HDFql::variableGetNumber(img_loaded.data));
HDFql::variableUnregister(img_loaded.data);
HDFql::execute("CLOSE FILE");
cv::imshow("loaded image", img_loaded);
cv::waitKey();
return 0;
}
这段代码基本上创建了一个新的 HDF5 文件,然后使用 OpenCV 打开一个图像并将该图像保存到 HDF5 文件中。然后它从 HDF5 文件中加载相同的图像并显示它。
如果你没有 OpenCV,你总是可以image.data用一个 uchar 数组替换,例如:uchar image_data[10] = {1,2,3,4,5,6,7,8,9,10};
长话短说,这不起作用,在检查 HDF5 文件时,它在保存步骤中已经失败。对我做错的任何帮助将不胜感激!