代码讲解:如何把3D数据转换成旋转的视频?

目录

3D数据集下载

读取binvox文件

使用matplotlib创建图

动画效果

完整代码


3D数据集下载

这里以shapenet数据集为例,可以访问外网的可以去直接申请下载;我也准备了一个备份在百度网盘的数据集,可以参考:

ShapeNet简介和下载、binvox文件python示例-CSDN博客

读取binvox文件

需要先安装binvox_rw:

https://github.com/wangqiang9/binvox_rw/tree/main

git clone git@github.com:wangqiang9/binvox_rw.git
cd binvox_rw
pip install .

然后调用接口读取binvox文件:

    # 读取 .binvox 文件with open(path, "rb") as f:model = binvox_rw.read_as_3d_array(f)

使用matplotlib创建图

   # 转换成 numpy 数组voxels = model.data# 旋转voxels = np.transpose(voxels, (2, 1, 0))voxels = np.transpose(voxels, (0, 2, 1))# 创建一个图和坐标轴fig = plt.figure()ax = fig.add_subplot(111, projection='3d')ax.set_axis_off()# 批量隐藏所有边框线for spine in ax.spines.values():spine.set_visible(False)# 隐藏刻度线ax.tick_params(bottom=False, left=False)# 创建一个可视化的体素图ax.voxels(voxels, edgecolor='k')

动画效果

    # 保存动画rot_animation.save(gif_path, dpi=100, writer='imagemagick')video = VideoFileClip(gif_path)target_duration = video.duration / 3compressed_video = video.fx(vfx.speedx, target_duration)compressed_video.write_videofile(video_path)

完整代码

import numpy as np
import binvox_rw
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import os
from moviepy.editor import *output_path = "/shapenet/video_ratate"
output_gif_path = "/datasets/shapenet/gif_ratate"
folder_path = "/datasets/shapenet/all/ShapeNetVox32/"
subfolders = [f.path for f in os.scandir(folder_path) if f.is_dir()]def func(path, gif_path, video_path):# 读取 .binvox 文件with open(path, "rb") as f:model = binvox_rw.read_as_3d_array(f)# 转换成 numpy 数组voxels = model.data# 旋转voxels = np.transpose(voxels, (2, 1, 0))voxels = np.transpose(voxels, (0, 2, 1))# 创建一个图和坐标轴fig = plt.figure()ax = fig.add_subplot(111, projection='3d')ax.set_axis_off()# 批量隐藏所有边框线for spine in ax.spines.values():spine.set_visible(False)# 隐藏刻度线ax.tick_params(bottom=False, left=False)# 创建一个可视化的体素图ax.voxels(voxels, edgecolor='k')# 保存动画帧函数def rotate(angle):ax.view_init(azim=angle)# 创建动画rot_animation = animation.FuncAnimation(fig, rotate, frames=np.arange(0, 360, 4), interval=0.5)# 保存动画rot_animation.save(gif_path, dpi=100, writer='imagemagick')video = VideoFileClip(gif_path)target_duration = video.duration / 3compressed_video = video.fx(vfx.speedx, target_duration)compressed_video.write_videofile(video_path)plt.show()for subfolder in subfolders:subfolders_1 = [f.path for f in os.scandir(subfolder) if f.is_dir()]for path in subfolders_1:path = os.path.join(path, 'model.binvox')gif_name = path.split('/')[-2] + ".gif"video_name = path.split('/')[-2] + ".mp4"gif_path = os.path.join(output_gif_path, gif_name)video_path = os.path.join(output_path, video_name)func(path, gif_path, video_path)

也可以看我在GitHub上写的案例:

https://github.com/wangqiang9/binvox_rw/blob/main/convert_to_video.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/526973.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++庖丁解牛】实现string容器的增删查改 | string容器的基本接口使用

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 前言📖pu…

数据结构部分

来源地址 一 数据结构 1 堆和树之间的区别 区别就在于树是没有特定顺序的,你需要遍历整个树才能找到特定元素;而堆是有序的,你可以直接找到最大(或最小)的元素。 堆:假设你正在开发一个任务调度系统&…

2024蓝桥杯每日一题(多路归并)

一、第一题:鱼塘钓鱼 解题思路:多路归并优先队列 首先枚举能走到的距离然后再用优先队列将最大的值累加 【Python程序代码】 from heapq import * n int(input()) a [0] list(map(int,input().split())) b [0] list(map(int,input().spli…

数据结构(九)——单链表的基本操作

😀前言 单链表是一种常见的数据结构,它由一系列结点组成,每个结点包含数据元素和指向下一个结点的指针。在本篇文章中,我们将讨论单链表的基本操作,包括初始化、销毁、清空、求表长、按值查找、插入和删除等操作。这些…

NGINX源码安装详细配置文档

NGINX源码安装详细配置文档 一、基础Linux指令 查看nginx进程是否启动:ps -ef | grep nginx 关闭防火墙:systemctl stop firewalld 开放80端口:firewall-cmd --zonepublic --add-port80/tcp --permanent 关闭80端口:firewall-cmd …

AJAX-HTTP协议

文章目录 HTTP协议请求报文响应报文接口文档 HTTP协议 规定了浏览器发送及服务器返回内容的格式 请求报文 浏览器按照HTTP协议要求的格式,发送给服务器的内容 组成部分: 1.请求行:请求方法,URL,协议 2.请求头&#…

数据结构(二)——线性表(顺序表)

二、线性表 2.1线性表的定义和基本操作 2.1.1 线性表的基本概念 线性表:是具有相同数据类型的 n 个数据元素的有限序列。(Eg:所有的整数按递增次序排列,不是顺序表,因为所有的整数是无限的)其中n为表长,当n0时线性表是一个空表…

【NR技术】 3GPP支持无人机服务的关键性能指标

1 性能指标概述 5G系统传输的数据包括安装在无人机上的硬件设备(如摄像头)收集的数据,例如图片、视频和文件。也可以传输一些软件计算或统计数据,例如无人机管理数据。5G系统传输的业务控制数据可基于应用触发,如无人机上设备的开关、旋转、升…

PostGIS 中的 K-Means 聚类操作及应用

K-Means算法: K-means 是数据科学和商业的基本算法。让我们深入了解一下。 1. K-means是一种流行的用于聚类的无监督机器学习算法。它是用于客户细分、库存分类、市场细分甚至异常检测的核心算法。 2. 无监督:K-means 是一种无监督算法,用于…

[蜥蜴书Chapter2] -- 创建测试集

目录 一、规则 二、方法 1、seed 2、identifier 1)选取一个身份号 2)选取一定比例的身份号作为测试集 3)身份号的选取: 3、利用scikit-learn: 1) 随机生成: 2)注:分类 3&a…

【C++】深度解剖多态

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是多态,熟练掌握多态的定义&a…

STM32之串口中断接收UART_Start_Receive_IT

网上搜索了好多,都是说主函数增加UART_Receive_IT()函数来着,实际正确的是UART_Start_Receive_IT()函数。 —————————————————— 参考时间:2024年3月9日 Cube版本:STM32CubeMX 6.8.1版本 参考芯片&#xff1a…