使用Open3D从单目深度图生成点云时遇draw_geometries参数错误
Open3D 0.15.1中draw_geometries参数错误及点云生成优化方案
问题背景
尝试用Open3D从单目深度图生成点云,环境配置:OpenCV == 4.4.0,Open3D == 0.15.1;输入BGR图像尺寸640x480x3,深度图像尺寸640x480x3。运行代码后触发参数类型错误。
代码实现
import open3d as o3d import numpy as np import matplotlib.pyplot as plt import os import sys import cv2 import open3d_tutorial as o3dtut o3dtut.interactive = not "CI" in os.environ color_raw = o3d.io.read_image('colorImg.jpg') depth_raw = o3d.io.read_image('depthImg2.png') rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(color_raw,depth_raw) print(rgbd_image) camera_intrinsic = o3d.camera.PinholeCameraIntrinsic( o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault) pcd = o3d.geometry.PointCloud.create_from_rgbd_image(rgbd_image, camera_intrinsic) pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]]) o3d.visualization.draw_geometries([pcd], zoom=0.5)
报错信息
TypeError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_18872/3179634559.py in <module> 1 pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]]) ----> 2 o3d.visualization.draw_geometries([pcd], zoom=0.5) TypeError: draw_geometries(): incompatible function arguments. The following argument types are supported: 1. (geometry_list: List[open3d.cpu.pybind.geometry.Geometry], window_name: str = 'Open3D', width: int = 1920, height: int = 1080, left: int = 50, top: int = 50, point_show_normal: bool = False, mesh_show_wireframe: bool = False, mesh_show_back_face: bool = False) -> None 2. (geometry_list: List[open3d.cpu.pybind.geometry.Geometry], window_name: str = 'Open3D', width: int = 1920, height: int = 1080, left: int = 50, top: int = 50, point_show_normal: bool = False, mesh_show_wireframe: bool = False, mesh_show_back_face: bool = False, lookat: numpy.ndarray[numpy.float64[3, 1]], up: numpy.ndarray[numpy.float64[3, 1]], front: numpy.ndarray[numpy.float64[3, 1]], zoom: float) -> None Invoked with: [PointCloud with 306097 points.]; kwargs: zoom=0.5
已尝试操作:将Open3D版本从0.16降级至0.15;调整图像尺寸。
解决方案
1. 核心参数错误修复
Open3D 0.15.1的draw_geometries函数有两个重载版本,zoom参数不能单独作为关键字传入,它仅在第二个重载版本中生效,且必须同时搭配lookat、up、front三个视角参数。
方案A:移除zoom参数,使用默认可视化
直接删除zoom=0.5,调用基础重载版本,之后可在Open3D可视化窗口通过鼠标滚轮手动调整缩放:
o3d.visualization.draw_geometries([pcd])
方案B:传入完整视角参数固定缩放比例
如果需要在代码中指定缩放比例,需同时传入lookat、up、front三个视角参数,示例如下:
import numpy as np # 使用默认视角参数 lookat = np.array([0.0, 0.0, 0.0]).reshape(3, 1) up = np.array([0.0, 1.0, 0.0]).reshape(3, 1) front = np.array([0.0, 0.0, -1.0]).reshape(3, 1) o3d.visualization.draw_geometries( [pcd], lookat=lookat, up=up, front=front, zoom=0.5 )
2. 深度图格式优化(潜在问题修复)
输入的深度图为3通道格式,但Open3D的RGBDImage.create_from_color_and_depth要求深度图为单通道,否则可能导致点云生成异常。建议在读取深度图后转换为单通道:
# 读取深度图并转换为单通道 depth_raw = o3d.io.read_image('depthImg2.png') depth_np = np.asarray(depth_raw) if depth_np.ndim == 3: depth_np = cv2.cvtColor(depth_np, cv2.COLOR_BGR2GRAY) depth_raw = o3d.geometry.Image(depth_np)
内容的提问来源于stack exchange,提问作者Topaz Green
相关产品推荐
相关产品推荐

