簡體   English   中英

Python 找到 3D 點雲或 3D 外殼的長軸

[英]Python find the long axis of a 3D point cloud or 3D hull

我試圖找到一個 3D 對象(描述為 3D 布爾或標簽數組)的“長軸”,它穿過(或靠近)該對象的質心。

我想我可以簡單地遍歷對象中的每一對點並選擇它們之間距離最大的點對,但是在下面的示例對象的情況下,該線不會穿過對象的中心。

同樣,我認為我可以計算每對點之間的距離,以找到在距離中心的某個最小距離內通過的最長的一對,但我擔心我正在重新發明輪子。 似乎應該有一些最小二乘擬合一條線,但我能夠挖掘的唯一解決方案是二維數組。

任何建議將不勝感激。

以下代碼顯示了一個非常簡單的 3D 形狀的尺寸。 我真正感興趣的形狀包含數千個點並且更復雜,但相似之處在於 1)兩點之間的最大距離可能遠離對象的中心,並且 2)它們是連接在一起的,因此它們可以被描述為單個連接的輪廓。

import matplotlib.pyplot as plt
import numpy as np

# make a simple 3D shape
t = [[[0,0,0,0,0],
      [0,0,1,0,0],
      [0,0,0,0,0],
      [0,0,0,0,0],
      [0,0,0,0,0]],

     [[0,0,0,0,0],
      [0,0,1,0,0],
      [0,1,1,1,0],
      [0,0,0,0,0],
      [0,0,0,0,0]],

     [[0,0,0,0,0],
      [0,0,1,0,0],
      [0,1,1,1,0],
      [0,0,0,0,0],
      [0,0,0,0,0]],

     [[0,0,0,0,0],
      [0,0,1,0,0],
      [0,1,1,1,0],
      [0,0,0,0,0],
      [0,0,0,0,0]],

     [[0,0,0,0,0],
      [0,0,1,0,0],
      [0,0,0,0,0],
      [0,0,0,0,0],
      [0,0,0,0,0]]]

t = np.array(t)

# find the centroid of the object
coords = np.where(t == 1)
x = np.mean(coords[0])
y = np.mean(coords[1])
z = np.mean(coords[2])

# show the object at different angles
fig, (ax1, ax2, ax3) = plt.subplots(1, 3)
ax1.imshow(np.max(t, axis=0))
ax1.plot(x,y, 'ro')
ax1.set_title('xy')
ax2.imshow(np.max(t, axis=1))
ax2.plot(x,z, 'ro')
ax2.set_title('xz')
ax3.imshow(np.max(t, axis=2))
ax3.plot(y,z, 'ro')
ax3.set_title('yz')
plt.show()

在此處輸入圖像描述

解決方案在這里

只需使用

image=np.array([[0,0,0,0,0],
                [0,0,1,0,0],
                [0,1,1,1,0],
                [0,0,0,0,0],
                [0,0,0,0,0]]

暫無
暫無

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

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