h5 pcd 互转

查看h5文件

import h5py
import numpy as np

# 申明句柄
f = h5py.File(
    'modelnet40_ply_hdf5_2048/ply_data_train0.h5',
    'r')
# 输出它的主键
print(f.keys())  # ['data', 'faceId', 'label', 'normal']
# 要打印出data的内容的话:
# print(f['data'][:])
# 要打印出data的形状的话:
print(f['data'][:].shape)  # train0-3 (2048, 2048, 3) / train4 (1648, 2048, 3)
                           # test0 (2048, 2048, 3)  / test1 (420, 2048, 3)

print(f['label'][:].shape)  # (2048, 1)

print(f['faceId'][:].shape)  # (2048, 2048)

print(f['normal'][:].shape)  # (2048, 2048, 3)


# HDF5的读取:
f = h5py.File('HDF5_FILE.h5', 'r')  # 打开h5文件
# 可以查看所有的主键
for key in f.keys():
    print(f[key].name)
    print(f[key].shape)
    print(f[key].value)

查看pcd文件

import open3d as o3d
import numpy as np

path = '/home/cv/文档/datasets/modelnet40_pcd/all_test/test_0.pcd'

def read_pcd(file_path):
    pcd = o3d.io.read_point_cloud(file_path)
    points = np.asarray(pcd.points)
    print(points)
    print(points.shape)

read_pcd(path)

批量转pcd

import h5py
import numpy as np
import os
import math
from open3d import *

filename = 'modelnet40_ply_hdf5_2048/ply_data_test1.h5'
f = h5py.File(filename, 'r')

data = f['data']
label = f['label']
for i in range(2048):
    print(i)
    one_data = data[i:i+1, :, :]  # (1, 2048, 3)
    one_label = label[i:i+1]  # (1, 1)

    one_data = np.concatenate(one_data, axis=0)  # (2048, 3)
    one_label = np.concatenate(one_label, axis=0)  # (1,)

    data_shape = np.shape(one_data)  # 2048,3

    WIDTH = data_shape[0]
    POINTS = WIDTH  # 2048


    path = 'datasets/modelnet40_pcd/all_test/test_'+ str(i+2048)+ '.pcd'
    if os.path.exists(path):
        os.remove(path)

    out = open(path, 'a')

    # headers
    out.write(
        '# .PCD v0.7 - Point Cloud Data file format\nVERSION 0.7\nFIELDS x y z\nSIZE 4 4 4\nTYPE F F F\nCOUNT 1 1 1')
    string = '\nWIDTH ' + str(WIDTH)
    out.write(string)
    out.write('\nHEIGHT 1\nVIEWPOINT 0 0 -2 0 1 0 0')
    string = '\nPOINTS ' + str(POINTS)
    out.write(string)
    out.write('\nDATA ascii')

    # datas
    for i in range(POINTS):
        string = '\n' + str(one_data[i, 0]) + ' ' + str(one_data[i, 1]) + ' ' + str(one_data[i, 2])
        out.write(string)

    out.close()

批量转h5

# -*- coding: utf-8 -*-

import h5py
import numpy as np
from open3d import *
import open3d as o3d


def read_label():
    filename = '/home/cv/PycharmProjects/PointCloud-Saliency-Maps/pointnet-master/data/' \
               'modelnet40_ply_hdf5_2048/ply_data_test1.h5'
    f = h5py.File(filename, 'r')
    # data = f['data']
    label = f['label'][:]
    return label  # (2048, 1)


def read_data():
    data = np.zeros((420, 1024, 3))
    for i in range(2048,2468):
        path = '/home/cv/文档/datasets/modelnet40_pcd/all_test_1/test_' + str(i) + '.pcd'
        pcd = o3d.io.read_point_cloud(path)
        points = np.asarray(pcd.points)  # (1024,3)
        data[i-2048] = points
    return data  # (2048,1024,3)


def wh5():
    data = read_data()
    label = read_label()
    f = h5py.File('/home/cv/PycharmProjects/PointCloud-Saliency-Maps/pointnet-master/'
                  'data/modelnet40_ply_hdf5_1024/ply_data_test1.h5', 'w')  # 创建一个h5文件,文件指针是f
    f['data'] = data  # 将数据写入文件的主键data下面
    f['label'] = label  # 将数据写入文件的主键labels下面
    f.close()  # 关闭文件

wh5()
  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将PCD文件换为图片,您可以使用以下步骤: 1. 读取PCD文件中的点云数据。您可以使用PCL(点云库)来读取PCD文件。 2. 将点云数据投影到图像平面上。您可以使用PCL中的投影函数将点云数据投影到图像平面上。 3. 将投影后的图像数据保存为图像文件。您可以使用OpenCV或其他图像处理库来保存图像文件。 以下是一个简单的C++示例代码,用于将PCD文件换为PNG图像文件(需要安装PCL和OpenCV): ```cpp #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/visualization/cloud_viewer.h> #include <opencv2/opencv.hpp> int main(int argc, char** argv) { // 读取PCD文件 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>("input.pcd", *cloud); // 投影点云到图像平面 int width = 640; int height = 480; cv::Mat image = cv::Mat::zeros(height, width, CV_8UC1); float fx = 525.0f; float fy = 525.0f; float cx = width / 2.0f; float cy = height / 2.0f; for (int i = 0; i < cloud->points.size(); ++i) { float x = cloud->points[i].x; float y = cloud->points[i].y; float z = cloud->points[i].z; int u = static_cast<int>(fx * x / z + cx); int v = static_cast<int>(fy * y / z + cy); if (u >= 0 && u < width && v >= 0 && v < height) { image.at<uchar>(v, u) = 255; } } // 保存图像文件 cv::imwrite("output.png", image); return 0; } ``` 在此示例中,我们使用PCL读取名为“input.pcd”的PCD文件,然后将点云数据投影到一个640x480的图像平面上,并将投影后的图像保存为名为“output.png”的PNG图像文件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值