TypeError: ('startswith first arg must be bytes or a tuple of bytes, not str', (1, array([0], dtype=uint32)))
Hi~ When I used pyrender to generate some results, I met some errors. My environment is: Ubuntu 16.04, Python3.7, cuda10.0 and with PyOpenGL PyOpenGL_accelerate installed.
import math
import trimesh
import pyrender
import numpy as np
from pyrender.constants import RenderFlags
from lib.models.spin import get_smpl_faces
class WeakPerspectiveCamera(pyrender.Camera):
def __init__(self,
scale,
translation,
znear=pyrender.camera.DEFAULT_Z_NEAR,
zfar=None,
name=None):
super(WeakPerspectiveCamera, self).__init__(
znear=znear,
zfar=zfar,
name=name,
)
self.scale = scale
self.translation = translation
def get_projection_matrix(self, width=None, height=None):
P = np.eye(4)
P[0, 0] = self.scale[0]
P[1, 1] = self.scale[1]
P[0, 3] = self.translation[0] * self.scale[0]
P[1, 3] = -self.translation[1] * self.scale[1]
P[2, 2] = -1
return P
class Renderer():
def __init__(self, resolution=(224,224), orig_img=False, wireframe=False):
self.resolution = resolution
self.faces = get_smpl_faces()
self.orig_img = orig_img
self.wireframe = wireframe
self.renderer = pyrender.OffscreenRenderer(
viewport_width=self.resolution[0],
viewport_height=self.resolution[1],
point_size=1.0
)
# set the scene
self.scene = pyrender.Scene(bg_color=[0.0, 0.0, 0.0, 0.0], ambient_light=(0.3, 0.3, 0.3))
light = pyrender.PointLight(color=[1.0, 1.0, 1.0], intensity=1)
light_pose = np.eye(4)
light_pose[:3, 3] = [0, -1, 1]
self.scene.add(light, pose=light_pose)
light_pose[:3, 3] = [0, 1, 1]
self.scene.add(light, pose=light_pose)
light_pose[:3, 3] = [1, 1, 2]
self.scene.add(light, pose=light_pose)
def render(self, img, verts, cam, angle=None, axis=None, mesh_filename=None, color=[1.0, 1.0, 0.9]):
mesh = trimesh.Trimesh(vertices=verts, faces=self.faces)
Rx = trimesh.transformations.rotation_matrix(math.radians(180), [1, 0, 0])
mesh.apply_transform(Rx)
if mesh_filename is not None:
mesh.export(mesh_filename)
if angle and axis:
R = trimesh.transformations.rotation_matrix(math.radians(angle), axis)
mesh.apply_transform(R)
sx, sy, tx, ty = cam
camera = WeakPerspectiveCamera(
scale=[sx, sy],
translation=[tx, ty],
zfar=1000.
)
material = pyrender.MetallicRoughnessMaterial(
metallicFactor=0.0,
alphaMode='OPAQUE',
baseColorFactor=(color[0], color[1], color[2], 1.0)
)
mesh = pyrender.Mesh.from_trimesh(mesh, material=material)
mesh_node = self.scene.add(mesh, 'mesh')
camera_pose = np.eye(4)
cam_node = self.scene.add(camera, pose=camera_pose)
if self.wireframe:
render_flags = RenderFlags.RGBA | RenderFlags.ALL_WIREFRAME
else:
render_flags = RenderFlags.RGBA
rgb, _ = self.renderer.render(self.scene, flags=render_flags)
valid_mask = (rgb[:, :, -1] > 0)[:, :, np.newaxis]
output_img = rgb[:, :, :-1] * valid_mask + (1 - valid_mask) * img
image = output_img.astype(np.uint8)
self.scene.remove_node(mesh_node)
self.scene.remove_node(cam_node)
return image
But I got the following error:
File "/home/frank/PycharmProjects/VIBE/lib/utils/renderer.py", line 118, in render
rgb, _ = self.renderer.render(self.scene, flags=render_flags)
File "/home/frank/PycharmProjects/VIBE/venv/lib/python3.7/site-packages/pyrender/offscreen.py", line 99, in render
return self._renderer.render(scene, flags)
File "/home/frank/PycharmProjects/VIBE/venv/lib/python3.7/site-packages/pyrender/renderer.py", line 121, in render
self._update_context(scene, flags)
File "/home/frank/PycharmProjects/VIBE/venv/lib/python3.7/site-packages/pyrender/renderer.py", line 709, in _update_context
p._add_to_context()
File "/home/frank/PycharmProjects/VIBE/venv/lib/python3.7/site-packages/pyrender/primitive.py", line 324, in _add_to_context
self._vaid = glGenVertexArrays(1)
File "src/latebind.pyx", line 39, in OpenGL_accelerate.latebind.LateBind.__call__
File "src/wrapper.pyx", line 314, in OpenGL_accelerate.wrapper.Wrapper.__call__
File "src/wrapper.pyx", line 311, in OpenGL_accelerate.wrapper.Wrapper.__call__
File "/home/frank/PycharmProjects/VIBE/venv/lib/python3.7/site-packages/OpenGL/platform/baseplatform.py", line 401, in __call__
if self.load():
File "/home/frank/PycharmProjects/VIBE/venv/lib/python3.7/site-packages/OpenGL/platform/baseplatform.py", line 390, in load
error_checker = self.error_checker,
File "/home/frank/PycharmProjects/VIBE/venv/lib/python3.7/site-packages/OpenGL/platform/baseplatform.py", line 148, in constructFunction
if (not is_core) and not self.checkExtension( extension ):
File "/home/frank/PycharmProjects/VIBE/venv/lib/python3.7/site-packages/OpenGL/platform/baseplatform.py", line 270, in checkExtension
result = extensions.ExtensionQuerier.hasExtension( name )
File "/home/frank/PycharmProjects/VIBE/venv/lib/python3.7/site-packages/OpenGL/extensions.py", line 98, in hasExtension
result = registered( specifier )
File "/home/frank/PycharmProjects/VIBE/venv/lib/python3.7/site-packages/OpenGL/extensions.py", line 105, in __call__
if not specifier.startswith( self.prefix ):
TypeError: ('startswith first arg must be bytes or a tuple of bytes, not str', (1, array([0], dtype=uint32)))
The error begin with
rgb, _ = self.renderer.render(self.scene, flags=render_flags)
Anyone can help? Thanks in advance!
Have you solved the problem? I have also faced this problem.
Have you solved the problem? I have also faced this problem.
No. Haven't.
Anyone can help?
Upgrading to PyOpenGL==3.1.5 helped
I fixed it with this
It still do not work under my condition LOL, is there other solution? Or just my misunderstanding that i just change one line in the source code of egl.py, just replace 'GL' with 'OpenGL'?
change os.environ['PYOPENGL_PLATFORM'] = 'osmesa' to os.environ['PYOPENGL_PLATFORM'] = 'egl' may solve this problem
Upgrading to PyOpenGL==3.1.5 helped
This fixed it for me too, thank you!