Как получить пиксельные координаты объекта после рендеринга сцены в виде изображения в pyrender?

#python #trimesh #pyrender

#python #trimesh #pyrender

Вопрос:

Я пытаюсь получить пиксельные координаты (x, y) объекта, который визуализируется с помощью pyrender. Цель состоит в том, чтобы получить координаты ограничивающего прямоугольника этого объекта. Я использую OffScreenRenderer для рендеринга сцены.

 r = pyrender.OffscreenRenderer(viewport_width=640,
                            viewport_height=480,
                            point_size=1.0)
color, depth = r.render(scene)
  

Доступная информация: матрица позирования camera_to_world

Сначала я попытался построить центроид объекта, как показано ниже:

 x, y = trimesh_mesh.centroid[:2]
height, width = image.shape[:2]
x = int(x * width)
y = int(y * height)
plt.imshow(image)
plt.scatter(x, y)
plt.show()
  

Я получаю следующее:
график изображения

Аналогично, график ограничивающей рамки для того же объекта находится здесь

Кто-нибудь знает, как я могу получить точные координаты центра тяжести и прямоугольника отображаемого объекта? Спасибо.

Комментарии:

1. У меня такая же проблема. Вы уже решили это? Если да, пожалуйста, ответьте на свой вопрос.

Ответ №1:

Вы ищете bpy_extras.object_utils.world_to_camera_view .

Используйте это так:

 import bpy
import bpy_extras

scene = bpy.context.scene
obj = bpy.context.object   # object you want the coordinates of
vertices = obj.data.vertices   # you will get the coordinates of its vertices

for v in vertices:
    # local to global coordinates
    co = v.co @ obj.matrix_world
    # calculate 2d image coordinates
    co_2d = bpy_extras.object_utils.world_to_camera_view(scene, camera, co)
    render_scale = scene.render.resolution_percentage / 100
    render_size = (
        int(scene.render.resolution_x * render_scale),
        int(scene.render.resolution_y * render_scale),
    )

    # this is the result
    pixel_coords = (co_2d.x * render_size[0],
                    co_2d.y * render_size[1])

    print("Pixel Coords:", (
          round(pixel_coords[0]),
          round(pixel_coords[1]),
    ))
  

Смотрите этот ответ на Blender Stack Exchange

Комментарии:

1. Привет @Finni. Спасибо за ваш ответ. Я не использую blender api, вместо этого я импортирую trimesh и pyrender для рендеринга изображений со сцены. Я решил проблему по-другому. У меня есть соответствующие двоичные маски, отображаемые со сцены. Используя эти маски, я мог бы довольно легко вычислить центроид.