Open3d: Configuration of o3d.visualization.Visualizer for bigger window sizes does not work

Created on 2 Jul 2020  路  2Comments  路  Source: intel-isl/Open3D

Describe the bug
Received [Open3D WARNING] [ViewControl] ConvertFromPinholeCameraParameters() failed because window height and width do not match., when setting the window size of o3d.visualization.Visualizer() to values bigger than (2501, 1326)

To Reproduce
Download the fountain dataset, extract it and set the variable o3d_dataset_idp in the following script to path/to/fountain/fountain_small
Then, run the script

import open3d as o3d
import re
import os
import copy
from cto.ext.o3d.file import get_file_list

# Taken from http://www.open3d.org/docs/release/tutorial/Advanced/color_map_optimization.html
def sorted_alphanum(file_list_ordered):
    convert = lambda text: int(text) if text.isdigit() else text
    alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
    return sorted(file_list_ordered, key=alphanum_key)

# Taken from http://www.open3d.org/docs/release/tutorial/Advanced/color_map_optimization.html
def get_file_list(path, extension=None):
    if extension is None:
        file_list = [path + f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
    else:
        file_list = [
            path + f
            for f in os.listdir(path)
            if os.path.isfile(os.path.join(path, f)) and os.path.splitext(f)[1] == extension
        ]
    file_list = sorted_alphanum(file_list)
    return file_list

# Taken from http://www.open3d.org/docs/release/tutorial/Advanced/color_map_optimization.html
def parse_o3d_data(depth_image_idp, color_image_idp):
    depth_image_ifp_list = get_file_list(
        depth_image_idp, extension=".png")
    color_image_ifp_list = get_file_list(
        color_image_idp, extension=".jpg")
    assert (len(depth_image_ifp_list) == len(color_image_ifp_list))

    rgbd_images = []
    for i in range(len(depth_image_ifp_list)):
        depth = o3d.io.read_image(os.path.join(depth_image_ifp_list[i]))
        color = o3d.io.read_image(os.path.join(color_image_ifp_list[i]))
        rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
            color, depth, depth_scale=1000.0)
        rgbd_images.append(rgbd_image)
    return rgbd_images


def render_test(mesh,
                camera_trajectory,
                show_rendering=False):

    vis = o3d.visualization.Visualizer()
    camera_parameter_list = camera_trajectory.parameters
    for camera_parameters in camera_parameter_list:

        width = 2501                # this fails here, but works with the default height
        height = 1326               # this fails here, but works with the default width

        focal_length = 500
        cx = width / 2.0 - 0.5
        cy = height / 2.0 - 0.5

        vis.create_window(
            width=width,
            height=height,
            # left=0,     # 50
            # top=0,      # 50
            visible=show_rendering)
        vis.add_geometry(mesh)
        view_control = vis.get_view_control()

        render_compatible_camera_parameters = copy.deepcopy(camera_parameters)
        render_compatible_camera_parameters.intrinsic.set_intrinsics(
            width, height, focal_length, focal_length, cx, cy)

        view_control.convert_from_pinhole_camera_parameters(
            render_compatible_camera_parameters)

        vis.poll_events()
        vis.update_renderer()


if __name__ == '__main__':

    # https://storage.googleapis.com/isl-datasets/open3d-dev/fountain.zip
    o3d_dataset_idp = 'path/to/fountain/fountain_small'
    depth_image_idp = os.path.join(o3d_dataset_idp, "depth/")
    color_image_idp = os.path.join(o3d_dataset_idp, "image/")
    camera_traj_ifp = os.path.join(o3d_dataset_idp, "scene/key.log")
    mesh_ifp = os.path.join(o3d_dataset_idp, "scene", "integrated.ply")

    camera_trajectory = o3d.io.read_pinhole_camera_trajectory(camera_traj_ifp)
    rgbd_images = parse_o3d_data(depth_image_idp, color_image_idp)
    mesh = o3d.io.read_triangle_mesh(mesh_ifp)

    render_test(
        mesh,
        camera_trajectory,
        show_rendering=True)

Expected behavior
ConvertFromPinholeCameraParameters()should not fail, because of different window sizes.

Environment

  • Operating system: (e.g., Ubuntu 18.04)
  • Python version: (e.g. Python 3.7.4)
  • Open3D version: 0.10.0.0
  • Is this remote workstation?: no
  • How did you install Open3D?: pip

Additional context

Parameter set 1: (default parameter, this works)
width = 1920
height = 1080

Parameter set 2: (this fails)
width = 1920
height = 1327 # 1326 works, 1327 fails

Parameter set 3: (this fails)
width = 2502 # 2501 works, 2502 fails
height = 1080

Parameter set 4: (this fails => the problem is not independent of both parameters)
width = 2501 # this fails here, but works with the default height
height = 1326 # this fails here, but works with the default width

This could be the same issue than #1164, however in the script above the intrinsic camera parameters are definitively correctly set.

possible bug

Most helpful comment

@yxlao can you have a look at this please.

All 2 comments

@yxlao can you have a look at this please.

@prewettg this should be possible using the new visualizer, right? Could you please provide an example?

Was this page helpful?
0 / 5 - 0 ratings

Related issues

marcel-bariou picture marcel-bariou  路  3Comments

prerakmody picture prerakmody  路  3Comments

DKandrew picture DKandrew  路  4Comments

Prakash19921206 picture Prakash19921206  路  4Comments

nrj127 picture nrj127  路  4Comments