当前位置: 首页 > news >正文

pyrender 渲染mesh

目录

render_meshes函数

调用函数


render_meshes函数


def overlay_human_meshes(humans, K, model, img_pil, unique_color=False):# Color of humans seen in the image._color = [color[0] for _ in range(len(humans))] if unique_color else color# Get focal and princpt for rendering.focal = np.asarray([K[0,0,0].cpu().numpy(),K[0,1,1].cpu().numpy()])princpt = np.asarray([K[0,0,-1].cpu().numpy(),K[0,1,-1].cpu().numpy()])# Get the vertices produced by the model.verts_list = [humans[j]['v3d'].cpu().numpy() for j in range(len(humans))]faces_list = [model.smpl_layer['neutral_10'].bm_x.faces for j in range(len(humans))]# Render the meshes onto the image.pred_rend_array = render_meshes(np.asarray(img_pil), verts_list,faces_list,{'focal': focal, 'princpt': princpt},alpha=1.0,color=_color)return pred_rend_array, _colordef render_meshes(img, l_mesh, l_face, cam_param, color=None, alpha=1.0, show_camera=False,intensity=3.0,metallicFactor=0., roughnessFactor=0.5, smooth=True,):"""Rendering multiple mesh and project then in the initial image.Args:- img: np.array [w,h,3]- l_mesh: np.array list of [v,3]- l_face: np.array list of [f,3]- cam_param: info about the camera intrinsics (focal, princpt) and (R,t) is possibleReturn:- img: np.array [w,h,3]"""# scenescene = pyrender.Scene(ambient_light=(0.3, 0.3, 0.3))# meshfor i, mesh in enumerate(l_mesh):if color is None:_color = (np.random.choice(range(1,225))/255, np.random.choice(range(1,225))/255, np.random.choice(range(1,225))/255)else:if isinstance(color,list):_color = color[i]elif isinstance(color,tuple):_color = colorelse:raise NotImplementedErrormesh = trimesh.Trimesh(mesh, l_face[i])# import ipdb# ipdb.set_trace()# mesh.visual = trimesh.visual.TextureVisuals(#     uv=None, #     material=trimesh.visual.material.PBRMaterial(#         metallicFactor=metallicFactor,#     roughnessFactor=roughnessFactor,#     alphaMode='OPAQUE',#     baseColorFactor=(_color[0], _color[1], _color[2], 1.0)#     ),#     image=None, #     face_materials=None# )# print('saving')# mesh.export('human.obj')# mesh = trimesh.load('human.obj')# print('loading')# mesh = pyrender.Mesh.from_trimesh(mesh, smooth=smooth)material = pyrender.MetallicRoughnessMaterial(metallicFactor=metallicFactor,roughnessFactor=roughnessFactor,alphaMode='OPAQUE',baseColorFactor=(_color[0], _color[1], _color[2], 1.0))mesh = pyrender.Mesh.from_trimesh(mesh, material=material, smooth=smooth)scene.add(mesh, f"mesh_{i}")# Adding coordinate system at (0,0,2) for the moment# Using lines defined in pyramid https://docs.pyvista.org/version/stable/api/utilities/_autosummary/pyvista.Pyramid.htmlif show_camera:import pyvistadef get_faces(x):return x.faces.astype(np.uint32).reshape((x.n_faces, 4))[:, 1:]# Camera = Box + Cone (or Cylinder?)material_cam = pyrender.MetallicRoughnessMaterial(metallicFactor=metallicFactor, roughnessFactor=roughnessFactor, alphaMode='OPAQUE', baseColorFactor=(0.5,0.5,0.5))height = 0.2radius = 0.1cone = pyvista.Cone(center=(0.0, 0.0, -height/2), direction=(0.0, 0.0, -1.0), height=height, radius=radius).extract_surface().triangulate()verts = cone.pointsmesh = pyrender.Mesh.from_trimesh(trimesh.Trimesh(verts, get_faces(cone)), material=material_cam, smooth=smooth)scene.add(mesh, f"cone")size = 0.1box = pyvista.Box(bounds=(-size, size, -size, size, verts[:,-1].min() - 3*size, verts[:,-1].min())).extract_surface().triangulate()verts = box.pointsmesh = pyrender.Mesh.from_trimesh(trimesh.Trimesh(verts, get_faces(box)), material=material_cam, smooth=smooth)scene.add(mesh, f"box")# Coordinate system# https://docs.pyvista.org/version/stable/api/utilities/_autosummary/pyvista.Arrow.htmll_color = [(1,0,0,1.0), (0,1,0,1.0), (0,0,1,1.0)]l_direction = [(1,0,0), (0,1,0), (0,0,1)]scale = 0.2pose3d = [2*scale, 0.0, -scale]for i in range(len(l_color)):arrow = pyvista.Arrow(direction=l_direction[i], scale=scale)arrow = arrow.extract_surface().triangulate()verts = arrow.points + np.asarray([pose3d])faces = arrow.faces.astype(np.uint32).reshape((arrow.n_faces, 4))[:, 1:]mesh = trimesh.Trimesh(verts, faces)material = pyrender.MetallicRoughnessMaterial(metallicFactor=metallicFactor, roughnessFactor=roughnessFactor, alphaMode='OPAQUE', baseColorFactor=l_color[i])mesh = pyrender.Mesh.from_trimesh(mesh, material=material, smooth=smooth)scene.add(mesh, f"arrow_{i}")focal, princpt = cam_param['focal'], cam_param['princpt']camera_pose = np.eye(4)if 'R' in cam_param.keys():camera_pose[:3, :3] = cam_param['R']if 't' in cam_param.keys():camera_pose[:3, 3] = cam_param['t']camera = pyrender.IntrinsicsCamera(fx=focal[0], fy=focal[1], cx=princpt[0], cy=princpt[1])# cameracamera_pose = OPENCV_TO_OPENGL_CAMERA_CONVENTION @ camera_posecamera_pose = np.linalg.inv(camera_pose)scene.add(camera, pose=camera_pose)# rendererrenderer = pyrender.OffscreenRenderer(viewport_width=img.shape[1], viewport_height=img.shape[0], point_size=1.0)# lightlight = pyrender.DirectionalLight(intensity=intensity)scene.add(light, pose=camera_pose)# renderrgb, depth = renderer.render(scene, flags=pyrender.RenderFlags.RGBA)rgb = rgb[:,:,:3].astype(np.float32)fg = (depth > 0)[:,:,None].astype(np.float32)# Simple smoothing of the maskbg_blending_radius = 1bg_blending_kernel = 2.0 * torch.ones((1, 1, 2 * bg_blending_radius + 1, 2 * bg_blending_radius + 1)) / (2 * bg_blending_radius + 1) ** 2bg_blending_bias =  -torch.ones(1)fg = fg.reshape((fg.shape[0],fg.shape[1]))fg = torch.from_numpy(fg).unsqueeze(0)fg = torch.clamp_min(torch.nn.functional.conv2d(fg, weight=bg_blending_kernel, bias=bg_blending_bias, padding=bg_blending_radius) * fg, 0.0)fg = fg.permute(1,2,0).numpy()# Alpha-blendingimg = (fg * (alpha * rgb + (1.0-alpha) * img) + (1-fg) * img).astype(np.uint8)renderer.delete()return img.astype(np.uint8)

调用函数

   p_x, p_y = None, NoneK = get_camera_parameters(model.img_size, fov=args.fov, p_x=p_x, p_y=p_y)print(i,K)# Make model predictionsstart = time.time()humans = forward_model(model, x, K,det_thresh=args.det_thresh,nms_kernel_size=args.nms_kernel_size)duration = time.time() - startl_duration.append(duration)if len(humans)==0:print('----------humans:0--------')if len(humans)>0:# Superimpose predicted human meshes to the input image.img_array = np.asarray(img_pil_nopad)img_pil_visu= Image.fromarray(img_array)pred_rend_array, _color = overlay_human_meshes(humans, K, model, img_pil_visu, unique_color=args.unique_color)

相关文章:

pyrender 渲染mesh

目录 render_meshes函数 调用函数 render_meshes函数 def overlay_human_meshes(humans, K, model, img_pil, unique_colorFalse):# Color of humans seen in the image._color [color[0] for _ in range(len(humans))] if unique_color else color# Get focal and princpt …...

防火墙安全策略

目录 一.拓扑信息 二.需求分析 三.命令行详细配置信息 1.配置IP 2.交换机配置 3.修改安全区域 4.安全策略 四.web界面详细配置 1.配置IP和设置安全区域 2.交换机配置 3.安全策略 五.测试 一.拓扑信息 二.需求分析 1.VLAN 2属于办公区域;VLAN 3属于生…...

selenium clear()方法清除文本框内容

在使用Selenium进行Web自动化测试时,清除文本框内容是一个常见的需求。这可以通过多种方式实现,取决于你使用的是哪种编程语言(如Python、Java等)以及你的具体需求。以下是一些常见的方法: 1. 使用clear()方法 clear…...

(回溯分割)leetcode93 复原IP地址

#include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; //卡尔的图不是按照程序执行过程而是直接画程序会执行的过程 // 实际执行是&#xff1a;n个字符&#xff0c;递推n1后&#xff08;叶子节点&#xff…...

高性能队列 Disruptor 在 IM 系统中的实战

高性能队列 Disruptor 在 IM 系统中的实战 前三期我们介绍了Disruptor的典型使用场景和相关高性能原理&#xff0c;本期我介绍一下Disruptor在IM系统用的应用实战&#xff0c;IM系统即社交聊天系统&#xff0c;对实时性的要求非常高&#xff0c;非常符合Disruptor的使用场景。 …...

原生HTML集合

一、表格 1、固定表格 <div class"tablebox"><div class"table-container"><table id"myTable" border"0" cellspacing"0" cellpadding"0"><thead><tr></tr></thead>…...

ES6 简单练习笔记--变量申明

一、ES5 变量定义 1.在全局作用域中 this 其实就是window对象 <script>console.log(window this) </script>输出结果: true 2.在全局作用域中用var定义一个变量其实就相当于在window上定义了一个属性 例如: var name "孙悟空" 其实就相当于执行了 win…...

2025.1.21——六、BUU XSS COURSE 1

题目来源&#xff1a;buuctf BUU XSS COURSE 1 一、打开靶机&#xff0c;整理信息 有吐槽和登陆两个尝试点&#xff0c;题目名称提示是XSS漏洞 XSS&#xff08;Cross-Site Scripting&#xff09;漏洞 1.定义&#xff1a;跨站脚本攻击&#xff0c;是一种常见的 Web 安全漏洞。攻…...

Linux - 五种常见I/O模型

I/O操作 (输入/输出操作, Input/Output) 是指计算机与外部设备就行数据交互的过程. 什么是外部设备: 如键盘, 鼠标, 硬盘, 网卡等. 五种常见的 I/O 模型: 阻塞 I/O非阻塞 I/O信号驱动 I/OI/O 多路复用异步 I/O 阻塞 I/O 阻塞 I/O 的特点: 当用户发起 I/O 请求后, 进程/线程就…...

【负载均衡式在线OJ】加载题目信息(文件版)

目录 如何读取文件 -- 常见流程 代码 如何读取文件 -- 常见流程 在C中使用 std::ifstream来打开文件流是一个常见的操作&#xff0c;用于创建一个输入文件流&#xff0c;并尝试打开名为 question_list的文件。if (!in.is_open())&#xff1a;检查文件是否成功打开。如果文件未…...

“上门按摩” 小程序开发项目:基于 SOP 的全流程管理

在竞争激烈的生活服务市场,“上门按摩” 服务需求日益增长。为满足这一需求,我们启动了 O2O 模式的 “上门按摩” 小程序开发项目,该项目涵盖客户端、系统管理端、技师端。以下将通过各类 SOP 对项目进行全面管理,确保项目顺利推进。 一、项目启动 SOP:5W2H 分析法 What(…...

WPF1-从最简单的xaml开始

1. 最简单的WPF应用 1.1. App.config1.2. App.xaml 和 App.xaml.cs1.3. MainWindow.xaml 和 MainWindow.xaml.cs 2. 正式开始分析 2.1. 声明即定义2.2. 命名空间 2.2.1. xaml的Property和Attribute2.2.2. xaml中命名空间2.2.3. partial关键字 学习WPF&#xff0c;肯定要先学…...

2025牛客寒假算法营2

A题 知识点&#xff1a;模拟 打卡。检查给定的七个整数是否仅包含 1,2,3,5,6 即可。为了便于书写&#xff0c;我们可以反过来&#xff0c;检查这七个整数是否不为 4 和 7。 时间 O(1)&#xff1b;空间 O(1)。 #include <bits/stdc.h> using namespace std;signed main()…...

编译Android平台使用的FFmpeg库

目录 前言 一、编译环境 二、搭建环境 1.安装MSYS2 2.更新系统包 2.1 打开MSYS2 MinGW 64-bit终端&#xff08;mingw64.exe&#xff09; 2.2 更新所有软件包到最新版本 2.3 安装必要的工具和库。 3. 克隆FFmpeg源码 4. 配置编译选项 5. 执行编译 总结 前言 记录学习…...

【C++高并发服务器WebServer】-2:exec函数簇、进程控制

本文目录 一、exec函数簇介绍二、exec函数簇 一、exec函数簇介绍 exec 函数族的作用是根据指定的文件名找到可执行文件&#xff0c;并用它来取代调用进程的内容&#xff0c;换句话说&#xff0c;就是在调用进程内部执行一个可执行文件。 exec函数族的函数执行成功后不会返回&…...

力扣707题(2)——设计链表

#题目 #3,5和6的代码 今天看剩下几个题的代码&#xff0c;1,2,4的代码已经在上篇博客写过了想看的小伙伴移步到&#xff1a; 力扣707题——设计链表-CSDN博客 //第3题头插法 void addAtHead(int val){ //记录头结点ListNode nhead; //新节点的创建,并让它指向原本头结点的后…...

K8S中ingress详解

Ingress介绍 Kubernetes 集群中&#xff0c;服务&#xff08;Service&#xff09;是一种抽象&#xff0c;它定义了一种访问 Pod 的方式&#xff0c;无论这些 Pod 如何变化&#xff0c;服务都保持不变。服务可以被映射到一个静态的 IP 地址&#xff08;ClusterIP&#xff09;、一…...

SpringBoot打包为JAR包或WAR 包,这两种打包方式在运行时端口将如何采用?又有什么不同?这篇文章将给你解惑

你们好,我是金金金。 前提 SpringBoot打包方式:不是jar就是war包 场景 写这篇文章也是我遇到一个很不理解的点,所以就去研究了一下 场景如下: 这是后端生产配置文件给项目设置的端口,然后我前端写的url是:我就很纳闷,前端写了域名以及后端服务上下文路径,咋没写端口呢,…...

zabbix6.0安装及常用监控配置

文章目录 部署zabbix-serverzabbix监控节点部署解决zabbix中文乱码创建主机组创建模版配置主机与模版关联 监控boot分区监控网卡流量出网卡流量监控进入和出的总流量监控内存监控服务器端口用户自定应监控key值 (监控mysql查询数量)zabbix触发器监控cpu监控入网卡流量 邮件告警…...

SQL-leetcode—1179. 重新格式化部门表

1179. 重新格式化部门表 表 Department&#xff1a; ---------------------- | Column Name | Type | ---------------------- | id | int | | revenue | int | | month | varchar | ---------------------- 在 SQL 中&#xff0c;(id, month) 是表的联合主键。 这个表格有关…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...

node.js的初步学习

那什么是node.js呢&#xff1f; 和JavaScript又是什么关系呢&#xff1f; node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说&#xff0c; 需要在node.js的环境上进行当JavaScript作为前端开发语言来说&#xff0c;需要在浏览器的环境上进行 Node.js 可…...

高效的后台管理系统——可进行二次开发

随着互联网技术的迅猛发展&#xff0c;企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心&#xff0c;成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统&#xff0c;它不仅支持跨平台应用&#xff0c;还能提供丰富…...