代码讲解:如何把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 / 3
    compressed_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 / 3
    compressed_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.mfbz.cn/a/445853.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 54. 螺旋矩阵

题目描述: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2: 输入&a…

Linux文件系列: 深入理解缓冲区和C标准库的简单模拟实现

Linux文件系列: 深入理解缓冲区和C标准库的简易模拟实现 一.缓冲区的概念和作用二.一个样例三.理解样例1.样例解释2.什么是刷新? 四.简易模拟实现C标准库1.我们要实现的大致框架2.mylib.h的实现1.文件结构体的定义2.myfopen等等函数的声明3.完整mylib.h代码 3.myfopen函数的实…

备战蓝桥杯Day25 - 二叉搜索树

一、基本概念 二叉搜索树(Binary Search Tree),又称为二叉查找树或二叉排序树,是一种具有特定性质的二叉树。 定义:二叉搜索树可以是一棵空树,也可以是具有以下特性的非空二叉树: 若其左子树不…

MAC OS 14.2.1 ASP.NET Core 调试遇到的端口占用的问题

一、问题描述 在调试 ASP.NET Core 项目时,遇到一个很奇怪的问题,不管项目是否已经运行,使用 Postman 测试接口时,都返回 403 Forbidden。重启电脑,刚开始还好好的,过一会儿就返回 403 Forbidden。 二、问…

AOP切面编程,以及自定义注解实现切面

AOP切面编程 通知类型表达式重用表达式切面优先级使用注解开发,加上注解实现某些功能 简介 动态代理分为JDK动态代理和cglib动态代理当目标类有接口的情况使用JDK动态代理和cglib动态代理,没有接口时只能使用cglib动态代理JDK动态代理动态生成的代理类…

2024蓝桥杯每日一题(双指针)

一、第一题:牛的学术圈 解题思路:双指针贪心 仔细思考可以知道,写一篇综述最多在原来的H指数的基础上1,所以基本方法可以是先求出原始的H指数,然后分类讨论怎么样提升H指数。 【Python程序代码】 n,l map(int,…

一篇文章搞定数字电桥

大家好,我是砖一。 最近做项目过程中,有一个应届生问我怎么测电容和电感,我推荐他使用数字电桥(也叫LCR表),他不会用,今天我写了一篇文章供小白们参考一下,包学会~ 一,…

WebRTC简介及实战应用 — 从0到1实现实时音视频聊天等功能

一、WebRTC简介 WebRTC 是由一家名为 Gobal IP Solutions,简称 GIPS 的瑞典公司开发的。Google 在 2011 年收购了 GIPS,并将其源代码开源。然后又与 IETF 和 W3C 的相关标准机构合作,以确保行业达成共识。其中: Web Real-Time Communications (WEBRTC) W3C 组织:定义浏览…

【npm】node包管理工具npm的介绍和基础使用

简言 npm 是 Node.js 的 包管理器(Package Manager),它是专门用于管理 Node.js 项目中第三方库的工具。 本文介绍下npm和其使用方法。 npm介绍 npm 是世界上最大的软件注册中心。各大洲的开源开发者都使用 npm 共享和借用软件包&#xff…

开源组件安全风险及应对

在软件开发的过程中,为了提升开发效率、软件质量和稳定性,并降低开发成本,使用开源组件是开发人员的不二选择(实际上,所有软件开发技术的演进都是为了能够更短时间、更低成本地构建软件)。这里的开源组件指…

Spring事件发布监听器ApplicationListener原理- 观察者模式

据说监听器模式也是mq实现的原理, 不过mq我还没来得及深入学习, 先用spring来理解一下吧 Spring事件发布监听器ApplicationListener原理- 观察者模式 什么是观察者模式一个Demo深入认识一下观察者模式Spring中的事件发布监听ps 什么是观察者模式 大家都听过一个故事叫做烽火戏…

Git学习笔记(流程图+示例)

概念 图中左侧为工作区,右侧为版本库。Git 的版本库里存了很多东西,其中最重要的就是暂存区。 • 在创建 Git 版本库时,Git 会为我们自动创建一个唯一的 master 分支,以及指向 master 的一个指 针叫 HEAD。(分支和HEAD…

设计模式-结构型模式-代理模式

代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。[DP] // 定义接口 interface Subject {void request(); }// 真实主题对象 class RealSubject implements Subject {Overridepublic void request() {System.out.println(&quo…

redis使用笔记

redis使用笔记 1、Redis简介1.1 含义1.2 功能1.3 特点 2. 常用的数据结构2.1 HASH 3 redis接口定义3.1 redisReply3.2 redisContext3.3 redisCommand 4 实践操作4.1 遇到问题4.1.1 Get哈希的时候返回error4.1.2 长度一直为0,str没法打印(未解决&#xff…

享受当下,2024,一顺百顺!

永远都不要提前焦虑, 也不要一直烦恼, 更不要被当前的情绪耗尽, 那样会对自己的身体造成严重的伤害, 自己只需要好好享受当下就行了。 车到山前必有路,关关难过关关过! 不要执着于过去,也不要过…

10-ARM gicv3/gicv4的总结-基础篇

目录 1、gic的版本2、GICv3/gicv4的模型图3、gic中断号的划分4、GIC连接方式5、gic的状态6、gic框架7、gic Configuring推荐 本文转自 周贺贺,baron,代码改变世界ctw,Arm精选, armv8/armv9,trustzone/tee,s…

LeetCode59:螺旋矩阵Ⅱ

题目描述 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]] 代码 class Solution { public:vector…

AWS 入门实践-远程访问AWS EC2 Linux虚拟机

远程访问AWS EC2 Linux虚拟机是AWS云计算服务中的一个基本且重要的技能。本指南旨在为初学者提供一系列步骤,以便成功地设置并远程访问他们的EC2 Linux实例。包括如何上传下载文件、如何ssh远程登录EC2虚拟机。 一、创建一个AWS EC2 Linux 虚拟机 创建一个Amazon…

GSEA -- 学习记录

文章目录 brief统计学原理部分其他注意事项转录组部分单细胞部分 brief 上一篇学习记录写了ORA,其中ORA方法只关心差异表达基因而不关心其上调、下调的方向,也许同一条通路里既有显著高表达的基因,也有显著低表达的基因,因此最后…

iMazing3 2024详细解析数据备份与恢复备份

iMazing 3的备份功能支持增量备份(类似苹果电脑里的Time Machine功能),意思是第一次把移动设备的数据全部备份下来,之后的备份就只针对数据有变化的那部分,这样可以节省大量的时间和存储空间,不会让使用者为…
最新文章