add render script
This commit is contained in:
parent
e1ccb44926
commit
982873a515
99
easymocap/visualize/render_func.py
Normal file
99
easymocap/visualize/render_func.py
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
'''
|
||||||
|
@ Date: 2021-11-22 15:48:13
|
||||||
|
@ Author: Qing Shuai
|
||||||
|
@ LastEditors: Qing Shuai
|
||||||
|
@ LastEditTime: 2022-05-05 16:43:17
|
||||||
|
@ FilePath: /EasyMocapPublic/easymocap/visualize/render_func.py
|
||||||
|
'''
|
||||||
|
# 提供各个接口的统一的对外的接口,封装了一些利用基础接口实现的功能
|
||||||
|
import cv2
|
||||||
|
class RenderFunc:
|
||||||
|
def __init__(self, render) -> None:
|
||||||
|
self.render = render
|
||||||
|
self.position = {}
|
||||||
|
|
||||||
|
def render_all(self, images, results, cameras, extra_mesh):
|
||||||
|
camnames = list(images.keys())
|
||||||
|
images = [images[cam] for cam in camnames]
|
||||||
|
cameras = [cameras[cam] for cam in camnames]
|
||||||
|
render_results = self.render.render_image(results, images, cameras,
|
||||||
|
extra_mesh=extra_mesh)
|
||||||
|
render_results = {cam: [res[nv] for res in render_results] for nv, cam in enumerate(camnames)}
|
||||||
|
return render_results
|
||||||
|
|
||||||
|
def render_image(self, images, results, cameras, extra_mesh):
|
||||||
|
render_results = self.render_all(images, results, cameras, extra_mesh)
|
||||||
|
results = {cam: val[2] for cam, val in render_results.items()}
|
||||||
|
return results
|
||||||
|
|
||||||
|
def render_mask(self, images, results, cameras, extra_mesh):
|
||||||
|
render_results = self.render_all(images, results, cameras, extra_mesh)
|
||||||
|
results = {cam: val[0][..., 3] for cam, val in render_results.items()}
|
||||||
|
return results
|
||||||
|
|
||||||
|
def render_depth(self, images, results, cameras, extra_mesh):
|
||||||
|
render_results = self.render_all(images, results, cameras, extra_mesh)
|
||||||
|
results = {cam: val[1] for cam, val in render_results.items()}
|
||||||
|
return results
|
||||||
|
|
||||||
|
def render_color(self, images, results, cameras, extra_mesh):
|
||||||
|
render_results = self.render_all(images, results, cameras, extra_mesh)
|
||||||
|
results = {cam: val[0][..., :3] for cam, val in render_results.items()}
|
||||||
|
return results
|
||||||
|
|
||||||
|
def render_corner(self, images, results, cameras, extra_mesh):
|
||||||
|
render_results = self.render_all(images, results, cameras, extra_mesh)
|
||||||
|
results = {}
|
||||||
|
for cam, (color, depth, image) in render_results.items():
|
||||||
|
mask = color[:, :, 3]
|
||||||
|
H, W = mask.shape[:2]
|
||||||
|
scale = 3
|
||||||
|
img_inp = cv2.resize(images[cam], (W//scale, H//scale))
|
||||||
|
if cam not in self.position.keys():
|
||||||
|
top_left = mask[:, :W//2]
|
||||||
|
top_right = mask[:, -W//2:]
|
||||||
|
if (top_left>0).sum() > (top_right>0).sum():
|
||||||
|
position = 'topleft'
|
||||||
|
else:
|
||||||
|
position = 'topright'
|
||||||
|
self.position[cam] = position
|
||||||
|
position = self.position[cam]
|
||||||
|
if position == 'topleft':
|
||||||
|
image[:img_inp.shape[0], -img_inp.shape[1]:, :3] = img_inp
|
||||||
|
elif position == 'topright':
|
||||||
|
image[:img_inp.shape[0], :img_inp.shape[1], :3] = img_inp
|
||||||
|
results[cam] = image
|
||||||
|
return results
|
||||||
|
|
||||||
|
def factory(self, mode):
|
||||||
|
if mode == 'image':
|
||||||
|
return self.render_image
|
||||||
|
elif mode == 'color':
|
||||||
|
return self.render_color
|
||||||
|
elif mode == 'depth':
|
||||||
|
return self.render_depth
|
||||||
|
elif mode == 'corner':
|
||||||
|
return self.render_corner
|
||||||
|
elif mode == 'mask':
|
||||||
|
return self.render_mask
|
||||||
|
elif mode == 'instance-mask':
|
||||||
|
return self.render_mask
|
||||||
|
elif mode.startswith('instance-depth'):
|
||||||
|
return self.render_depth
|
||||||
|
|
||||||
|
def get_ext(mode):
|
||||||
|
ext = {'image': '.jpg', 'color':'.jpg', 'blend': '.jpg',
|
||||||
|
'depth':'.png', 'mask':'.png', 'instance':'.png',
|
||||||
|
'instance-mask': '.png', 'instance-depth': '.png', 'instance-depth-twoside': '.png',
|
||||||
|
'side': '.jpg'
|
||||||
|
}.get(mode, '.jpg')
|
||||||
|
return ext
|
||||||
|
|
||||||
|
def get_render_func(mode, backend='pyrender'):
|
||||||
|
if backend == 'pyrender':
|
||||||
|
from .pyrender_wrapper import Renderer
|
||||||
|
render = Renderer()
|
||||||
|
else:
|
||||||
|
raise NotImplementedError
|
||||||
|
renderer = RenderFunc(render)
|
||||||
|
return renderer.factory(mode)
|
Loading…
Reference in New Issue
Block a user