国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Open3D Surface reconstruction 表面重建

這篇具有很好參考價值的文章主要介紹了Open3D Surface reconstruction 表面重建。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Surface reconstruction 表面重建

在許多情況下,我們希望生成密集的3D幾何體,即三角形網(wǎng)格(triangle mesh)。然而,從多視點立體方法或深度傳感器中,我們只能獲得非結(jié)構(gòu)化的點云。要從此非結(jié)構(gòu)化輸入中獲取三角形網(wǎng)格,我們需要執(zhí)行表面重建。在文獻中存在幾種方法,Open3D目前實現(xiàn)了以下方法:
Alpha shapes(阿爾法形狀)
Ball pivoting(球旋轉(zhuǎn))
Poisson surface reconstruction(泊松表面重建)

Alpha shapes

阿爾法形狀[Edelsbrunner1983]是凸殼的推廣。正如這里[https://graphics.stanford.edu/courses/cs268-11-spring/handouts/AlphaShapes/as_fisher.pdf]所描述的,人們可以直觀地將阿爾法形狀想象成:想象一大堆冰淇淋,其中包含這些點作為硬巧克力塊。使用其中一個球形冰淇淋勺子,我們雕刻出冰淇淋塊的所有部分,我們可以在不碰到巧克力塊的情況下到達,從而甚至在內(nèi)部雕刻出孔洞(例如,只需從外面移動勺子就無法到達的部分)。我們最終將得到一個由大寫字母、弧線和點邊界的(不一定是凸的)物體。如果我們現(xiàn)在將所有圓面拉直為三角形和線段,則可以直觀地描述所謂的 alpha 形狀S。

Open3D 實現(xiàn)了涉及權(quán)衡參數(shù)alpha的方法create_from_point_cloud_alpha_shape。

bunny = o3d.data.BunnyMesh()
mesh = o3d.io.read_triangle_mesh(bunny.path)
mesh.compute_vertex_normals()

pcd = mesh.sample_points_poisson_disk(750)
o3d.visualization.draw_geometries([pcd])
alpha = 0.03
print(f"alpha={alpha:.3f}")
mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha)
mesh.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh], mesh_show_back_face=True)

該實現(xiàn)基于點云的凸殼。如果我們想從給定的點云中計算多個 alpha 形狀,那么我們可以通過只計算凸殼一次并將其傳遞給 create_from_point_cloud_alpha_shape來節(jié)省一些計算。

tetra_mesh, pt_map = o3d.geometry.TetraMesh.create_from_point_cloud(pcd)
for alpha in np.logspace(np.log10(0.5), np.log10(0.01), num=4):
    print(f"alpha={alpha:.3f}")
    mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(
        pcd, alpha, tetra_mesh, pt_map)
    mesh.compute_vertex_normals()
    o3d.visualization.draw_geometries([mesh], mesh_show_back_face=True)

Ball pivoting

球樞軸算法(ball pivoting algorithm,BPA)[Bernardini1999]是一種與阿爾法形狀相關(guān)的表面重建方法。直觀地說,想想一個具有給定半徑的3D球,我們將其落在點云上。如果它擊中任何3個點(并且它沒有落在這3個點上),它就會創(chuàng)建一個三角形。然后,算法開始從現(xiàn)有三角形的邊緣旋轉(zhuǎn),每次它擊中球沒有落下的3個點時,我們都會創(chuàng)建另一個三角形。
Open3D 在create_from_point_cloud_ball_pivoting中實現(xiàn)了此方法。該方法接受與在點云上旋轉(zhuǎn)的各個球的半徑相對應(yīng)的參數(shù)列表radii。
Note:此方法假設(shè)點云具有法線。

bunny = o3d.data.BunnyMesh()
gt_mesh = o3d.io.read_triangle_mesh(bunny.path)
gt_mesh.compute_vertex_normals()
pcd = gt_mesh.sample_points_poisson_disk(3000)
o3d.visualization.draw_geometries([pcd])


radii = [0.005, 0.01, 0.02, 0.04]
rec_mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(
    pcd, o3d.utility.DoubleVector(radii))
o3d.visualization.draw_geometries([pcd, rec_mesh])

Poisson surface reconstruction

泊松曲面重構(gòu)方法 [Kazhdan2006] 求解了一個正則化優(yōu)化問題,得到了一個光滑的曲面。因此,泊松曲面重建可能比上述方法更可取,因為它們會產(chǎn)生非平滑的結(jié)果、因為PointCloud點也是所得三角形網(wǎng)格的點vertices,無需任何修改。

Open3D實現(xiàn)了該方法create_from_point_cloud_poisson,該方法基本上是Kazhdan代碼的包裝器。該函數(shù)的一個重要參數(shù)depth是定義用于表面重建的八叉樹的深度,因此意味著所得三角形網(wǎng)格的分辨率。depth值越高,表示網(wǎng)格具有更多細節(jié)。
Note:此方法假設(shè)點云具有法線。

import open3d as o3d
eagle_path = r'../data/EaglePointCloud.ply'
pcd = o3d.io.read_point_cloud(eagle_path)

print(pcd)
o3d.visualization.draw_geometries([pcd],
                                  zoom=0.664,
                                  front=[-0.4761, -0.4698, -0.7434],
                                  lookat=[1.8900, 3.2596, 0.9284],
                                  up=[0.2304, -0.8825, 0.4101])


print('run Poisson surface reconstruction')
with o3d.utility.VerbosityContextManager(
        o3d.utility.VerbosityLevel.Debug) as cm:
    mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(
        pcd, depth=9)
print(mesh)
o3d.visualization.draw_geometries([mesh],
                                  zoom=0.664,
                                  front=[-0.4761, -0.4698, -0.7434],
                                  lookat=[1.8900, 3.2596, 0.9284],
                                  up=[0.2304, -0.8825, 0.4101])

泊松表面重建也會在低點密度區(qū)域創(chuàng)建三角形,甚至推斷到某些區(qū)域(見上面鷹輸出的底部)。函數(shù)create_from_point_cloud_poisson具有第二個返回值densities,該值指示每個頂點的密度。低密度值意味著頂點僅由輸入點云中的少量點支持。

在下面的代碼中,我們使用偽彩色在3D中可視化密度。紫色表示低密度,黃色表示高密度。

print('visualize densities')
densities = np.asarray(densities)
density_colors = plt.get_cmap('plasma')(
    (densities - densities.min()) / (densities.max() - densities.min()))
density_colors = density_colors[:, :3]
density_mesh = o3d.geometry.TriangleMesh()
density_mesh.vertices = mesh.vertices
density_mesh.triangles = mesh.triangles
density_mesh.triangle_normals = mesh.triangle_normals
density_mesh.vertex_colors = o3d.utility.Vector3dVector(density_colors)
o3d.visualization.draw_geometries([density_mesh],
                                  zoom=0.664,
                                  front=[-0.4761, -0.4698, -0.7434],
                                  lookat=[1.8900, 3.2596, 0.9284],
                                  up=[0.2304, -0.8825, 0.4101])

我們可以進一步使用密度值來刪除具有低支撐的頂點和三角形。在下面的代碼中,我們刪除了密度值低于0.01所有密度值的分位數(shù)的所有頂點(和連接的三角形)。

print('remove low density vertices')
vertices_to_remove = densities < np.quantile(densities, 0.01)
mesh.remove_vertices_by_mask(vertices_to_remove)
print(mesh)
o3d.visualization.draw_geometries([mesh],
                                  zoom=0.664,
                                  front=[-0.4761, -0.4698, -0.7434],
                                  lookat=[1.8900, 3.2596, 0.9284],
                                  up=[0.2304, -0.8825, 0.4101])

Normal estimation 法線估計

在上面的例子中,我們假設(shè)點云具有指向外部的法線。但是,并非所有點云都已附帶相關(guān)的法線。Open3D 可用estimate_normals估計點云法線,其局部擬合每個 3D 點的平面以推導(dǎo)出法線。但是,估計的法線可能不是一致的。 orient_normals_consistent_tangent_plane使用最小生成樹傳播法線。文章來源地址http://www.zghlxwxcb.cn/news/detail-426504.html

bunny = o3d.data.BunnyMesh()
gt_mesh = o3d.io.read_triangle_mesh(bunny.path)

pcd = gt_mesh.sample_points_poisson_disk(5000)
pcd.normals = o3d.utility.Vector3dVector(np.zeros(
    (1, 3)))  # invalidate existing normals

pcd.estimate_normals()
o3d.visualization.draw_geometries([pcd], point_show_normal=True)


pcd.orient_normals_consistent_tangent_plane(100)
o3d.visualization.draw_geometries([pcd], point_show_normal=True)

到了這里,關(guān)于Open3D Surface reconstruction 表面重建的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • open3d 0.17.0的open3d.visualization.ViewControl類有bug

    在使用過程中發(fā)現(xiàn) open3d.visualization.ViewControl 的如下方法,在 open3d 0.17.0 環(huán)境下不起作用,點云的顯示視場還是默認配置;而在 open3d 0.16.0 環(huán)境下卻正常工作。 rotate set_front set_lookat set_up set_zoom 上述測試代碼在如下虛擬環(huán)境中進行過測試,均失敗。 在如下虛擬環(huán)境中正常工作

    2024年02月21日
    瀏覽(19)
  • Open3D點云數(shù)據(jù)處理(一):VSCode配置python,并安裝open3d教程

    Open3D點云數(shù)據(jù)處理(一):VSCode配置python,并安裝open3d教程

    專欄地址:https://blog.csdn.net/weixin_46098577/category_11392993.html 在很久很久以前,我寫過這么一篇博客,講的是open3d點云處理的基本方法。?? 當(dāng)時是 PyCharm + Anaconda + python3.8 + open3d 0.13 已經(jīng)是2023年了,現(xiàn)在有了全新版本。目前python由當(dāng)年的3.8更新到了3.11版本,open3d也從0.13來到了

    2024年02月07日
    瀏覽(37)
  • 【Open3D可視化——添加標(biāo)簽】:如何在Open3D的可視化窗口中添加文字標(biāo)簽?

    【Open3D可視化——添加標(biāo)簽】:如何在Open3D的可視化窗口中添加文字標(biāo)簽? Open3D是一個基于Python語言開發(fā)的跨平臺開源工具包,主要用于三維數(shù)據(jù)處理和可視化。在進行三維數(shù)據(jù)可視化過程中,往往需要在場景中添加標(biāo)簽來標(biāo)識物體、點云等信息。本文將介紹如何在Open3D的可

    2024年02月11日
    瀏覽(208)
  • Open3D讀取文件

    Open3D讀取文件

    Open3D可以讀取點云文件,三角網(wǎng)格文件,也可以讀取圖片。具體方法如下: 一、點云文件操作 ????????Open3D支持的文件格式有xyz,xyzn,xyzrgb,pts,ply,pcd等文件。讀取的方式也非常簡單。data = o3d.io.read_point_cloud(\\\"文件名“) 1、讀寫文件 ????????函數(shù)原型如下: ???

    2024年02月08日
    瀏覽(22)
  • Open3D學(xué)習(xí)筆記

    Open3D是一個開源庫,它支持處理3D數(shù)據(jù)的軟件的快速開發(fā)。Open3D前端在C++和Python中有一些公開的數(shù)據(jù)結(jié)構(gòu)和算法。后端經(jīng)過高度優(yōu)化,并設(shè)置為并行化。 PCL也是3D點云數(shù)據(jù)處理的優(yōu)秀開源庫,在C++平臺上表現(xiàn)較好,但是在Python上python-pcl長時間不更新,維護少,不太好用,不建

    2024年02月01日
    瀏覽(19)
  • 什么是open3D?

    什么是open3D?

    目錄 一、說明 二、如何安裝open3d?? 三、顯示點云數(shù)據(jù) 3.1 顯示點云場景數(shù)據(jù) 3.2 體素下采樣 3.3 頂點法線估計 ????????對于點云?處理,這里介紹哦pen3d,該軟件和opencv同樣是interl公司的產(chǎn)品。 ????????Open3D 是一個開源庫,支持快速開發(fā)處理 3D 數(shù)據(jù)的軟件。 Open3D 前

    2024年02月03日
    瀏覽(17)
  • Open3D-讀取深度圖

    ???????深度圖像(Depth Images)也被稱為距離影像(Range Image),是指將從圖像采集器到場景中各點的距離值作為像素值的圖像,它直接反應(yīng)了 景物可見表面的幾何形狀 。獲取方法有: 激光雷達深度成像法、計算機立體視覺成像、坐標(biāo)測量機法、莫爾條紋法、結(jié)構(gòu)光法。

    2024年02月13日
    瀏覽(27)
  • Open3D點云處理

    Open3D點云處理

    Open3D is an open-source library that supports rapid development of software that deals with 3D data. The Open3D frontend exposes a set of carefully selected data structures and algorithms in both C++ and Python. The backend is highly optimized and is set up for parallelization. Open3D是一個支持3D數(shù)據(jù)處理軟件快速開發(fā)的開源庫,在前端提供

    2023年04月17日
    瀏覽(25)
  • open3d點云平移

    open3d點云平移

    功能簡介 open3d中點云的平移函數(shù)為:pcd.translate((tx, ty, tz), relative=True)。當(dāng)relative為True時,(tx, ty, tz)表示點云平移的相對尺度,也就是平移了多少距離。當(dāng)relative為False時,(tx, ty, tz)表示點云中心(質(zhì)心)平移到的指定位置。質(zhì)心可以坐標(biāo)可以通過pcd.get_center()得到。 代碼

    2024年01月22日
    瀏覽(42)
  • Open3d入門教程

    【英文版】 Open3D Python包通過 PyPI 和 Conda發(fā)布。 支持的Python版本: 3.6 3.7 3.8 支持的操作系統(tǒng): Ubuntu 18.04+ macOS 10.14+ Windows 10 (64-bit) 如果你有其他Python版本(比如 Python 2) 或操作系統(tǒng),請參考 編譯源碼 并從源代碼處編譯Open3D。 Pip (PyPI) 注意: 一般來說,我們建議使用虛擬環(huán)境 來集

    2024年02月16日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包