python实现3D体素raw到点云txt bin的转换

在最近进行3D数据的标注的过程中,发现现有主流的标注程序无法直接读取.raw文件,只能读取.bin或者.txt文件,又是便有了将体素文件.raw转换为.txt或者.bin的需求。

首先需要明确的是.raw .txt .bin这三种格式的文件主要是实现的数据保存,并不局限于3D数据,只是某些3D数据标注软件恰好能够根据既定规则正确读取.raw .txt .bin为3D数据,由于我也只是初步接触到.raw .txt .bin这三种文件形式对3D数据进行保存,可能存在某些错误观点,望请批评指正。

点云和体素的区别

点云和体素都是3D数据的一种体现:

  • 体素:包含3D数据中的每个点的值
  • 点云:包含了每个点对应的坐标,也可包含3D数据对应坐标位置处的点的值。
    • 点云数据可以只保存坐标信息,不保存坐标对应的点的值,当然也可以在保存坐标信息的同时保存对应位置的值。
      • 当同时保存坐标和值时,3D数据中每个点值会由4个值表示x y z vaule,其中x y z是值vaule在3D数据体中对应的空间坐标。如0 0 0 34表示空间位置x=0 y=0 z=0的位置值为34。
      • 当只保存坐标信息时,每个点便由3个值表示x y z,其只能表示对应位置上有值,但不知道值具体是多少。
    • 通过点云表示3D数据时可以忽略3D数据中值为0的点,一般点云文件默认没有读取到的坐标默认值为0,当然,你保存了也没问题。举个例子:在shape为[10,10,10]的3D数据中,在data_3d[3,4,5]==0,那么可以直接忽略掉这一个点,也可以将其保存为3 4 5 0

.raw .txt .bin

.raw .txt .bin只是数据格式,其主要是实现对数据的保存,只要是数据,其都能保存,但是,在保存3D数据的体素和点云时,一下需要注意:
,如果现在我们有一个shape为[10,10,10]的numpy数组形式的3D数据data_3d

  • .raw:直接对3D数据的各点的值进行保存,即直接保存10*10*10个数,可直接通过numpy对数组保存为.raw文件:data_3d.tofile("save_name.raw")
  • .txt:以点云的形式保存3D数据内的值,如图所示,txt中的每一行代表一个点云点信息
    • numpy可以直接将数组保存为.txt文件:np.savetxt('save_name.txt', data,fmt="%d")如果数组是shape为[3,4]的2维数组,那么保存为.txt后在txt文件中将会有3行4列,每一列用空格隔开,每个值将对应数组里面的值。
  • .bin:和.txt一样用点云形式保存3D数据,和.txt类似,每行表示一个点云点。
    • numpy也可直接将数组保存为.bin格式文件:data.tofile('save_name.bin')
      点云数据txt文件内容

python代码实现从.raw体素到.txt .bin点云的转换

def raw2bin(raw_path,shape,dtype):
    """
    实现从.raw体素到.txt .bin点云的转换
    :param raw_path: raw文件的文件地址
    :param shape: raw保存的数据的shape
    :param dtype: raw文件保存数据的数据类型,如np.int8
    :return: 保存转换过后的.txt 和.bin 点云格式文件
    """
    #读取raw文件为1维数组
    raw_data_long = np.fromfile(raw_path,dtype=dtype)
    #将一维数组reshape为正确的3D形状
    raw_data = raw_data_long.reshape(shape)

    # ##可以直接调整阈值筛除小于阈值的点
    # threshold=-10
    # raw_data[raw_data>threshold]=0
    # raw_data_long[raw_data_long>threshold]=0

    ##通过循环实现,但是太慢了
    # bin=[]
    # for i in range(shape[0]):
    #     for j in range(shape[1]):
    #         for z in range(shape[2]):
    #             data_ijz=raw_data[i,j,z]
    #             if data_ijz!=0:
    #                 bin.append([i,j,z,data_ijz])
    # bin = np.array(bin)
    # new_arr = np.delete(raw_data_long, np.where(raw_data_long == 0))

    #删除1维数据中为0的点
    new_arr = np.delete(raw_data_long, np.where(raw_data_long == 0))

    #得到3D数据中不为点的坐标
    x,y,z=np.nonzero(raw_data)

    #生成点云数组
    bin=np.zeros([len(x),4])
    # print(bin.shape)
    # print(np.nonzero(raw_data))
    bin[:, 0]=  x
    bin[:, 1] = y
    bin[:, 2] = z
    bin[:, 3] = new_arr

    #保存点云数组为txt和bin
    bin.astype(np.float32).tofile(f'cloudpoints.bin')
    np.savetxt(f'cloudpoints.txt',bin")
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值