首页 > 编程语言 >C++读取FY卫星遥感图像(HDF格式)

C++读取FY卫星遥感图像(HDF格式)

时间:2023-12-15 17:24:09浏览次数:35  
标签:name int FY C++ HDF printf include id size

转一下我自己的博客

网上找了大概2周,艰难的实现了C++读取HDF图像,CSDN吃相真难看,好多文章都要会员。。。

#include <cstdint>
#include <hdf5.h>
#include <iostream>
#include <matplotlibcpp.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
namespace plt = matplotlibcpp;
using namespace std;
//该函数用于读取hdf文件中group、data等信息
herr_t op_func(hid_t loc_id, const char* name, const H5O_info_t* info,void*operator_data)
{
    printf("/");               /* Print root group in object path */

    /*
     * Check if the current object is the root group, and if not print
     * the full path name and type.
     */
    if (name[0] == '.')         /* Root group, do not print '.' */
        printf("  (Group)\n");
    else
        switch (info->type) {
            case H5O_TYPE_GROUP:
                printf("%s  (Group)\n", name);
                break;
            case H5O_TYPE_DATASET:
                printf("%s  (Dataset)\n", name);
                break;
            case H5O_TYPE_NAMED_DATATYPE:
                printf("%s  (Datatype)\n", name);
                break;
            default:
                printf("%s  (Unknown)\n", name);
        }

    return 0;
}
void hdf5_test1(){
    // 打开HDF5文件
    char file_path[] = "test.HDF";
    hid_t file_id=H5Fopen(file_path, H5F_ACC_RDONLY,H5P_DEFAULT );
    herr_t status;
    //这里读取hdf信息,找到数据保存位置
    status = H5Ovisit(file_id, H5_INDEX_NAME, H5_ITER_NATIVE, op_func, nullptr, H5O_INFO_ALL);
    hid_t dataset_id;
    //"/Data/NOMChannel03"就是需要事先读取的数据保存位置
    dataset_id = H5Dopen1(file_id, "/Data/NOMChannel03");

    hid_t dataspace_id = H5Dget_space(dataset_id);
    int ndims;
    //获取数据维度
    ndims = H5Sget_simple_extent_ndims(dataspace_id);
    auto dims = new hsize_t[ndims];
    //获取数据大小
    H5Sget_simple_extent_dims(dataspace_id, dims, nullptr);
    auto x = dims[0];
    auto y = dims[1];
    size_t nn = x*y;
    hid_t datatype_id;
    H5T_class_t dataclass;
    size_t size;
    datatype_id = H5Dget_type(dataset_id);
    dataclass= H5Tget_class(datatype_id);
    size = H5Tget_size(datatype_id);
    cv::Mat img = cv::Mat(int(x), int(y), CV_16S);//CV_16S是为了读取short类型数据
    if(dataclass == H5T_INTEGER){
        if (size == sizeof(short)) {
            auto* buffer = (short*) calloc(nn, sizeof(short));
            //H5T_NATIVE_SHORT表示short类型
            H5Dread(dataset_id, H5T_NATIVE_SHORT, H5S_ALL,H5S_ALL, H5P_DEFAULT, buffer);
            int n = 0;
            short *ptmp = NULL;
            for(int i=0; i<x; i++)
            {
                ptmp = img.ptr<short>(i);//指针指向img的第i行
                for(int j=0;j<y;j++) {
                    ptmp[j] = buffer[n++];
                }
            }
            cv::imwrite("../output.png", img);
            cv::namedWindow("新图", cv::WINDOW_KEEPRATIO);
            cv::imshow("新图", img);
            // 等待100000 ms后窗口自动关闭
            cv::waitKey(0);
            free(buffer);
            H5Fclose(file_id);
            H5Dclose(dataset_id);
        }
        else {
            printf("2dData::readHDF5: unknown integer type, size=%i\n",(int) size);
        }
    }
    else {
        printf("2dData::readHDF5: unknown HDF5 data type\n");
    }
}



int main() {
    hdf5_test1();
}

 

标签:name,int,FY,C++,HDF,printf,include,id,size
From: https://www.cnblogs.com/zxl260/p/17903810.html

相关文章

  • c++ 学习
     c++中常用的class:在C++中,有一些常用的标准库类和一些常见的自定义类,它们提供了各种功能,从容器和算法到文件处理和输入/输出。以下是一些在C++中常用的类:###标准库类:1.**std::string:**-用于处理字符串的类,提供了许多字符串操作的方法。2.**std::vector:**-动态......
  • c++11 乱模版
    std::is_same,std::enable_if,std::is_integraltemplate<typenameT>boolisZero(Tv){if(std::is_same<T,float>::value){return(fabs(v)<FLT_EPSILON);}elseif(std::is_same<T,double>::value){......
  • windows C++
    https://en.cppreference.com/w/cpp/string/basic_stringstd::basic_string C++ Stringslibrary std::basic_string Definedinheader <string>  template<   class CharT,   class Traits = std::char_traits<CharT>,   class......
  • C++ Qt开发:DateTime日期时间组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QDateTime日期与时间组件的常用方法及灵活运用。在Qt中,日期和时间的处理通常使用QDateTime类。......
  • windows c++ socket
    socket用winsocket时,send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,可以设置收发时限:intnNetTimeout=1000;//1秒//发送时限setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char*)&nNetTimeout,sizeof(int));//接收时限setsockopt(socket,SOL_SOCKET,......
  • C++基础 -7- 引用
    ———————引用———————引用就是数据本身不占用空间 ......
  • java: 通过URL读取hadoop HDFS
    packagetju;importorg.apache.hadoop.fs.FsUrlStreamHandlerFactory;importorg.apache.hadoop.io.IOUtils;importjava.io.InputStream;importjava.net.MalformedURLException;importjava.net.URL;importjava.net.URLStreamHandlerFactory;publicclassReadF......
  • hadoop:通过Configuration读取hdfs
    packagetju;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FSDataInputStream;importorg.apache.hadoop.fs.FSDataOutputStream;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io......
  • 用C++调用Windows.Media.Ocr接口实现图片的OCR识别
    这个接口最开始是给UWP程序用的。C++里需要用C++/WinRT方式调用。默认参数的识别率也不是很高的样子。只支持Win10+。#include<winrt/Windows.Storage.h>#include<winrt/Windows.Storage.Streams.h>#include<winrt/Windows.Graphics.Imaging.h>#include<winrt/Windows.Me......
  • C++(this指针)
    在C++中,this是一个关键字,表示指向当前对象的指针。它是每个非静态成员函数的一个隐式参数,被用于指向调用该函数的对象。通过this指针,成员函数可以访问调用它的对象的成员变量和成员函数。以下是一个简单的示例,演示了this指针的使用:#include<iostream>classMyClass{......