61 lines
2.2 KiB
Python
61 lines
2.2 KiB
Python
from configargparse import ArgParser, YAMLConfigFileParser, ArgumentDefaultsRawHelpFormatter
|
|
from sys import exit
|
|
from open3d.geometry import Geometry
|
|
from open3d.visualization import Visualizer
|
|
from open3d.io import write_pinhole_camera_parameters
|
|
from pathlib import Path
|
|
|
|
|
|
from util import (
|
|
load_dataset_from_bag,
|
|
existing_file,
|
|
)
|
|
|
|
|
|
def create_camera_settings(geometry: Geometry, camera_config_output_json_path: Path) -> None:
|
|
vis = Visualizer()
|
|
vis.create_window()
|
|
vis.add_geometry(geometry)
|
|
vis.run()
|
|
parameters = vis.get_view_control().convert_to_pinhole_camera_parameters()
|
|
write_pinhole_camera_parameters(camera_config_output_json_path.as_posix(), parameters)
|
|
print(f"Written camera config to {camera_config_output_json_path.as_posix()}!")
|
|
vis.destroy_window()
|
|
|
|
|
|
def main() -> int:
|
|
parser = ArgParser(
|
|
config_file_parser_class=YAMLConfigFileParser,
|
|
default_config_files=["create_camera_settings_config.yaml"],
|
|
formatter_class=ArgumentDefaultsRawHelpFormatter,
|
|
description="Use an interactive window to move the camera and export the camera view at the moment of closing"
|
|
" the window into a JSON file",
|
|
)
|
|
parser.add_argument("--render-config-file", is_config_file=True, help="yaml config file path")
|
|
parser.add_argument("--input-bag-path", required=True, type=existing_file, help="path to bag file")
|
|
parser.add_argument(
|
|
"--camera-config-output-json-path",
|
|
default=Path("./saved_camera_settings.json"),
|
|
type=Path,
|
|
help="path the camera settings json file should be saved to",
|
|
)
|
|
parser.add_argument(
|
|
"--bag-pointcloud-index",
|
|
type=int,
|
|
default=0,
|
|
help="index of the frame inside the experiment bag that should be displayed in 3d",
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
print("Creating camera settings!")
|
|
print("Move the view in the window to the desired camera position" " and then close the window using the ESC key!")
|
|
dataset = load_dataset_from_bag(args.input_bag_path)
|
|
open3d_pointcloud = dataset[args.bag_pointcloud_index].to_instance("open3d")
|
|
create_camera_settings(open3d_pointcloud, args.camera_config_output_json_path)
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
exit(main())
|