isl-org / Open3D

Open3D: A Modern Library for 3D Data Processing
http://www.open3d.org
Other
11.56k stars 2.32k forks source link

Configuration of o3d.visualization.Visualizer for bigger window sizes does not work #2036

Open SBCV opened 4 years ago

SBCV commented 4 years ago

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

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.

griegler commented 4 years ago

@yxlao can you have a look at this please.

germanros1987 commented 4 years ago

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