簡體   English   中英

如何在 Python 中生成網格的局部視圖作為點雲?

[英]How do I generate a partial view of a mesh as a point cloud in Python?

我有一個網格數據集,我想用它來生成局部視圖數據作為點雲。 換句話說,模擬 RGB-D 傳感器的工作方式。

我的解決方案非常幼稚,所以請隨意忽略它並提出另一種方法。

它包括從 o3d 可視化中獲取渲染的 RGB 和渲染的 D 圖像,如下所示:

vis.add_geometry(tr_mesh)

... # set some params to have a certain angle

vis.capture_screen_image('somepath.png')
vis.capture_depth_image('someotherpath.png')

這些被保存為 PNG 文件。 然后我將它們組合成一個 o3d RGBDImage:

 # Load the RGB image
 rgb = o3d.io.read_image(rgb_path)

 # Load the depth image
 depth = o3d.io.read_image(depth_path)

 # Convert the RGB and depth images into pointcloud
 rgbd = o3d.geometry.RGBDImage.create_from_color_and_depth(color=o3d.geometry.Image(rgb), 
                                                           depth=o3d.geometry.Image(depth), 
                                                           convert_rgb_to_intensity=False)

並將其轉換為 PointCloud

pcd = o3d.geometry.PointCloud.create_from_rgbd_image(image=rgbd,
intrinsic=o3d.camera.PinholeCameraIntrinsic(o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault))

這有很多限制:

  • 深度被量化為 256 個值。 它們實際上是 0...255,因此它們與圖像高度和寬度的比例不匹配。 更不用說,它完全失去了網格 object 本身的原始比例。
  • 相機參數(焦距等)沒有完全相同地重新創建,因此點雲變形了。

同樣,這是一個非常幼稚的解決方案,因此非常歡迎完全不同的方法。

不是我可以從網格生成點雲嗎? 因為我想要局部視圖。 所以想想這個問題,但背面剔除。

回到解決方案。

不需要圖像捕獲。 有一個function叫vis.capture_depth_point_cloud()

所以局部視圖可以通過簡單地運行來生成

vis.add_geometry(tr_mesh)

... # set some params to have a certain angle

vis.capture_depth_point_cloud("somefilename.pcd")

這還有一個非常有用的名為convert_to_world_coordinate的參數。

似乎沒有辦法改變傳感器的分辨率。 雖然向上(或向下)縮放 object,捕獲點雲,然后向下(或向上)縮放點雲應該獲得相同的效果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM