当前位置: 首页 > 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) 是表的联合主键。 这个表格有关…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

当下AI智能硬件方案浅谈

背景&#xff1a; 现在大模型出来以后&#xff0c;打破了常规的机械式的对话&#xff0c;人机对话变得更聪明一点。 对话用到的技术主要是实时音视频&#xff0c;简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术&#xff0c;开发自己的大模型。商用方案多见为字节、百…...

短视频时长预估算法调研

weighted LR o d d s T p 1 − p ( 1 − p ) o d d s T p ( T p o d d s ∗ p ) o d d s p o d d s T o d d s odds \frac{Tp}{1-p} \newline (1-p)odds Tp \newline (Tp odds * p) odds \newline p \frac{odds}{T odds} \newline odds1−pTp​(1−p)oddsTp(Tpodds…...