2022年6月15日 星期三

軟體層次操作3D物件的好幫手,Open3D

基本資料

安裝使用3.8.5,核心為C語言,使用介面為Python(連結)。

讀取PLY檔案

point_cloud = o3d.geometry.PointCloud()
point_cloud.points = o3d.utility.Vector3dVector(points)
points = o3d.utility.Vector3dVector(cuboid_points) << 會出現畫面

基礎操作:Point downsample

pcd.voxel_down_sample(voxel_size=0.05)

基礎操作:Vertex normal estimation

這和按下N的效果差不多,按+和-可以改變預測的長度。
downpcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
o3d.visualization.draw_geometries([downpcd],point_show_normal=True)

基礎操作:選取區域進行切割處理

範例 boxcut boxcut2
vol = o3d.visualization.read_selection_polygon_volume("cropped.json")
chair = vol.crop_point_cloud(pcd)

基礎操作:Point 加入顏色

chair.paint_uniform_color([1, 0.706, 0])

基礎操作:計算Points彼此距離

compute the distance from a source point cloud to a target point cloud. I.e., it computes for each point in the source point cloud the distance to the closest point in the target point cloud.
dists = pcd.compute_point_cloud_distance(chair)
dists = np.asarray(dists)
ind = np.where(dists > 0.01)[0]  << 這個數字決定要切割出的深度
pcd_without_chair = pcd.select_by_index(ind)

基礎操作:尋找頂點區域

smallest convex set that contains all points
dists = pcd.compute_point_cloud_distance(chair)
dists = np.asarray(dists)
ind = np.where(dists > 0.01)[0]  << 這個數字決定要切割出的深度
pcd_without_chair = pcd.select_by_index(ind)

進階功能:移除雜點

範例(連結) cleannoise
計算點和大家的距離,移除最不相關的項目,畫面會更乾淨。可以移除毛點,或合併後減少數量。目前是要加入很多參數,這些數字應該是要動態決定。

進階功能:ICP

範例 non_blocking_visualization
會自動選擇不同方向和大小進行組合

進階功能:Open3D-ML

Open3D-ML is an extension of Open3D for 3D machine learning tasks.

呈現基本:

陽春的顯示界面,滑鼠讓點旋轉放大縮小,按住ctrl移動滑鼠可以移動物體位置,按住shift移動滑鼠會呈現旋轉的感覺。

o3d.visualization.draw_geometries([point_cloud, oriented_bounding_box])

呈現進階:Non-blocking visualization

範例 non_blocking_visualization

ICP過程變成動態顯示(移除pipeline才能編譯),物體慢慢靠近。

呈現進階:按鈕等

Open3D似乎不喜歡被融入其專案視窗,而最新版本0.10開始有自己的UI界面。

沒有留言:

張貼留言