open3d显示图像


Open3d快速上手💎 点云对象详解

ImageWidget

作为三维点云工具,Open3D连三维的形状都能画出来,那二维的图像就更不在话下了。ImageWidgetgui中显示图像的控件,和大多数控件不同的是,图像控件提供了多种构造函数

  1. 无参数,将生成一个没有图像的占位区域
  2. 输入路径,将打开该路径所对应的图像
  3. 输入Image类型的数据
  4. 输入t.geometry中的Image类型数据

图像控件

现以第二种为例,创建一个图像控件

import open3d as o3d
import open3d.visualization.gui as gui
import open3d.visualization.rendering as rendering
app = gui.Application.instance

app.initialize()
win = app.create_window("Image")
imgFrame = gui.ImageWidget("test.jpg")
win.add_child(imgFrame)
app.run()

这个效果没什么好看的,就不展示了。

Imageopen3d.geometry中的一种数据类型,其默认的初始化方式是通过矩阵,下面用随机数生成一个矩阵,并装载到图像中

import numpy as np
img_data = (np.random.rand(300, 600)*255).astype(np.uint8)
img = o3d.geometry.Image(img_data)
imgFrame = gui.ImageWidget(img)

效果如下

在这里插入图片描述
ImageWidget中提供了update_image的方法,可以更新显示的图像内容,其输入参数同样为Image类型数据。其官网说明如下

Mostly a convenience function for ui_image.update_image(). If ‘image’ is the same size as the current image, will update the texture with the contents of ‘image’. This is the fastest path for setting an image, and is recommended if you are displaying video. If ‘image’ is a different size, it will allocate a new texture, which is essentially the same as creating a new UIImage and calling SetUIImage(). This is the slow path, and may eventually exhaust internal texture resources.

此外,也可以将图像数据点云化,然后再通过三维显示控件显示出来。回顾在点云类中学到的内容,通过一个深度图像和一个rgb图像,就可以创建点云。

raw = o3d.io.read_image("test.jpg")
depth = o3d.geometry.Image(np.ones([610, 1024],dtype=np.uint8))
rgbd = o3d.geometry.RGBDImage.create_from_color_and_depth(raw, depth, convert_rgb_to_intensity=False)
inter = o3d.camera.PinholeCameraIntrinsic()
inter.set_intrinsics(1024, 610, 500, 500, 512, 305)
pcd = o3d.geometry.PointCloud().create_from_rgbd_image(rgbd, inter)
o3d.visualization.draw_geometries([pcd])

其效果如图所示

请添加图片描述

下一篇即讲解open3d中最强大的UI控件SceneWidget

### 使用 Open3D 显示平面图 为了使用 Open3D 将点云数据投影并显示为二维图像,可以按照如下方法操作: #### 创建和加载点云数据 首先创建或加载点云数据。如果已经拥有点云文件,则可以直接通过 `read_point_cloud` 函数来载入。 ```python import open3d as o3d pcd = o3d.io.read_point_cloud("path_to_your_pcd_file.ply") # 加载PLY格式的点云文件 ``` #### 定义相机视角和平面参数 定义一个虚拟摄像机的位置以及目标平面上的一个法向量,这有助于决定如何将空间中的点映射到该平面上。 ```python # 设置视点位置 (eye), 平面中心(center),上方向(up_vector) camera_pose = [[0, 0, -5], [0, 0, 0], [0, -1, 0]] ``` #### 投影至2D平面 利用Open3D提供的功能或者自定义逻辑计算每个点在指定平面上对应的坐标值,并将其存储在一个新的数组里作为最终要绘制出来的2D图形的数据源[^1]。 对于简单的正交投影,可以选择忽略Z轴上的信息;而对于透视投影,则可能涉及到更复杂的矩阵运算以模拟真实世界的观察效果。 #### 可视化2D投影结果 最后一步就是渲染这些经过转换后的二维坐标点了。虽然Open3D主要用于三维场景下的交互式查看器,但是也可以借助其他Python绘图库比如Matplotlib来进行此工作。 ```python import matplotlib.pyplot as plt import numpy as np def project_points_onto_plane(points, plane_normal=[0, 0, 1]): """Project points onto a given plane defined by its normal vector.""" projected_points = [] for point in points: dot_product = sum([a*b for a,b in zip(point, plane_normal)]) projection_factor = dot_product / sum(plane_normal[i]*plane_normal[j] for i,j in [(0,0),(1,1),(2,2)]) proj_point = [p - n*projection_factor for p,n in zip(point, plane_normal)] # Only keep X and Y coordinates after projecting to the XY-plane. projected_points.append(proj_point[:2]) return np.array(projected_points) projected_pts = project_points_onto_plane(np.asarray(pcd.points)) plt.scatter(*zip(*projected_pts)) plt.axis('equal') plt.show() ``` 上述代码片段展示了怎样从已有的3D点云出发,经由特定方式投射成2D形式再加以呈现的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值