草庐IT

Python点云显示:open3d快速上手

微小冷 2023-04-17 原文

文章目录


有关open3d点云对象的更系统的讲解: Open3d点云对象详解

上手

open3d主要用于三维对象绘制,为Python提供了非常友好的接口,而且封装了一些基础的点云处理算法,加之Intel维护给力,是Python中处理三维对象的首选模块。

安装很方便

pip install open3d

装完之后还是老规矩,请出斯坦福兔子刷一波成就感

# 此行代码后面不再重复引入
import open3d as o3d
pcd = o3d.io.read_point_cloud("rabbit.pcd")
o3d.visualization.draw_geometries([pcd])

除了import之外,两行代码,第一行是读取本地点云文件rabbit.pcd,第二步绘图,结果如下

此界面虽然只有点云,但可通过快捷键进行交互,除了点击拖动改变视角之外,还可通过正负号调节点的尺寸;Ctrl和正负号调节网格尺寸;方括号可用于调节视场角。

鼠标控制则很符合直觉,只需Shift、Ctrl然后加上鼠标左键来回拖动,只需试一下就会明白其操作机理,要比文字描述更直观。

对于常用快捷键,由于稍微嫌多,故列在下面

常规指令
H会在命令行中打印英文版的帮助信息,包含快捷键信息
Q/Esc退出窗口
R重置视点
N开关点云法线渲染
S切换平滑着色和网格平面着色
W开关网格线框
B开关背面渲染
I开关插值中的图像放大
T在图像渲染之间切换:无拉伸/保持比例/自由拉伸
P截屏
D进行深度捕捉
O捕获当前渲染设置
L开关照明

数字键用于颜色控制,其中单独点击数设置点云颜色;Ctrl+数字设置网格颜色,Shift用于调用内置的伪彩映射

单独数字/CtrlShift
0默认灰度
1渲染点颜色JET颜色
2颜色对应x坐标Summer颜色
3颜色对应y坐标Winer颜色
4颜色对应z坐标HOT颜色
9正常颜色-

几何变换

鼠标拖动点云的过程,其实对点云进行了空间变换,手段无外乎三种:平移、旋转和缩放。open3d通过translate, rotation, scale来实现这些功能。

下面就演示一下这三个函数

import copy

# 此为原始点云
pcd0 = o3d.io.read_point_cloud("rabbit.pcd")

# 1号点云,沿x轴移动20米
pcd1 = copy.deepcopy(pcd0).translate((20, 0, 0))
pcd1.paint_uniform_color([1, 0, 0])  #设为红色,100 表示rgb

# 2号点云,演示缩放
pcd2 = copy.deepcopy(pcd0).translate((40, 0, 0))
# 前一个参数为缩放比例;后一个参数为缩放后的位置,为必填项
pcd2.scale(0.5, center=pcd2.get_center())
pcd2.paint_uniform_color([0, 1, 1])

# 3号点云,通过欧拉角旋转
pcd3 = copy.deepcopy(pcd0).translate((0, -20, 0))
# 采用Euler角的方法生成旋转角,表示绕y轴旋转90°
thEuler = pcd3.get_rotation_matrix_from_xyz((0,np.pi/2,0))
pcd3.rotate(thEuler)
pcd3.paint_uniform_color([0, 1, 0])

# 4号点云,通过轴角法旋转
pcd4 = copy.deepcopy(pcd0).translate((20, -20, 0))
# 通过轴角表示法生成旋转角,表示绕y轴旋转60°
th = np.array([0, np.pi/3, 0]).T
thAxis = pcd4.get_rotation_matrix_from_axis_angle(th)
pcd4.rotate(thAxis)
pcd4.paint_uniform_color([0, 0, 1])

# 5号点云,通过四元数旋转
pcd5 = copy.deepcopy(pcd0).translate((40, -20, 0))
# 通过四元数法生成转角,表示绕x轴旋转180°
quart = np.array([0,0,0,1]).T
thQuart = pcd5.get_rotation_matrix_from_quaternion(quart)
pcd5.rotate(thQuart)
pcd5.paint_uniform_color([1, 0, 1])

# 5绘图函数可以输入点云列表
pcds = [pcd0, pcd1, pcd2, pcd3, pcd4, pcd5]
o3d.visualization.draw_geometries(pcds)

效果如下

其中平移和缩放没什么好说的,对于旋转,需要知道欧拉角有三个分量,分别是横滚、俯仰以及航向,代表绕x、y、z轴旋转。

考虑一架正在飞行的飞机,以某一时刻前后为x轴、左右为y轴、上下为z轴。则航向角就是飞机前进方向偏离的角度;俯仰角就是飞机头尾姿态的俯仰;横滚角描述的就是飞机翅膀的摆动。

欧拉角用于描述静态角度是没问题的,但用于表示旋转时会导致万向节死锁,简单来说就是飞机的航向角变化90°之后,其横滚轴变成了俯仰轴,而四元数则没有这个顾虑。

设欧拉角为 ( ψ , θ , ϕ ) (\psi,\theta,\phi) (ψ,θ,ϕ),则四元数可表示为

Q = [ cos ⁡ ( ψ / 2 ) 0 0 sin ⁡ ( ψ / 2 ) ] [ cos ⁡ ( θ / 2 ) 0 sin ⁡ ( θ / 2 ) 0 ] [ cos ⁡ ( ϕ / 2 ) sin ⁡ ( ϕ / 2 ) 0 0 ] \bold{Q}=\begin{bmatrix} \cos(\psi/2)\\0\\0\\\sin(\psi/2) \end{bmatrix}\begin{bmatrix} \cos(\theta/2)&0&\sin(\theta/2)&0 \end{bmatrix}\begin{bmatrix} \cos(\phi/2)\\\sin(\phi/2)\\0\\0 \end{bmatrix} Q= cos(ψ/2)00sin(ψ/2) [cos(θ/2)0sin(θ/2)0] cos(ϕ/2)sin(ϕ/2)00

曲面重建

尽管实现点云绘制已经十分炫酷了,但是毕竟不够真实。斯坦福兔子据说也是用3D扫描仪扫出来的,所以其原型必定不是离散的点,而是连续的面。

作为专业的点云处理模块,open3d提供了多种生成表面的方法。

Alpha Shapes算法

Alpha Shapes算法又叫滚球法,思想很简单,不妨先从二维着手来理解。

假设平面上有一群点,然后我手里有一个球,只要我这个球足够大,那么当这个球滚向这群点之后,就会把最外层的点的轮廓描绘出来,而不至于串入点集的内部。

将这种二维的滚圆法推广到三维,就是滚球法,在open3d中,提供了create_from_point_cloud_alpha_shape函数,用以生成Alpha shapes,其中输入为点云和alpha参数。

将alpha分别设为0.3,0.6,0.9和1.2,得到结果为

绘图代码如下

tri = o3d.geometry.TriangleMesh
pcd = o3d.io.read_point_cloud("rabbit.pcd")
meshes = []
alpha = 0
for i in range(4):
    alpha += 0.3
    tmpPcd = copy.deepcopy(pcd0).translate((i*20, 0, 0))
    mesh = tri.create_from_point_cloud_alpha_shape(tmpPcd, alpha)
    mesh.compute_vertex_normals()
    meshes.append(mesh)

o3d.visualization.draw_geometries(meshes, mesh_show_back_face=True)

在曲面生成过程中,命令行输出了生成的三角形个数

TriangleMesh with 31267 points and 83772 triangles.
TriangleMesh with 34591 points and 95546 triangles.
TriangleMesh with 32583 points and 82728 triangles.
TriangleMesh with 29041 points and 67944 triangles.

其他重建方法

BPA(Ball pivoting Algorithm)算法从翻译来说,是更加纯正的滚球法,其基本思路也是滚球,但不同于Alpha Shapes,BPA直接将落在滚球上的点连接起来,作为轮廓。

由于在open3d中调用这种方法需要先设置法向量,故而等到讲完法向量再做BPA的代码示例。

此外,open3d还提供了泊松表面重构算法,但理解泊松表面的过程,需要首先理解八叉树,故而讲完八叉树再行讲解。

有关Python点云显示:open3d快速上手的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  5. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  6. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  7. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  10. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

随机推荐