我正試圖為一個使用激光雷達的學校專案撰寫一些有效的代碼。目標是過濾掉點云中超過10米的任何東西,并將其傳遞出去。我可以寫一個for回圈來做這件事,但它不是很優化。我的目標是用NumPy有效地完成這個任務。
def get_distance(input_array)。
return np.sqrt(np.sum(np.square(input_array)))
def filter_by_distance(cloud, distance=10)。
cloud1 = [item for item in cloud if get_distance(item) <= distance ]
return np.asarray(cloud1)
cloud是一個包含[X,Y,Z,I]的多維np.陣列
。[[23.157 0.032 0.992 0.34 ]
[23.219 0.105 0.994 0.29 ]
[23.282 0.179 0.996 0.26 ] 。
...
[1.548 -1.101 -0.77 0. ] 。
[1.388 -0.978 -0.6760.]
[1.42 -0.964 -0.684 0. ]]
我正在使用get_distance(cloud[:,0:2])來獲取x,y的距離,但我似乎找不到一種方法來使用這個修剪原始點云,而不用for回圈。我希望得到任何幫助!
uj5u.com熱心網友回復:
計算平方內行的總和,不需要sqrt,直接與平方距離比較
def filter_by_distance(cloud, distance=10)。
# np.sum是用c實作的,非常快。
# axis = 1 for summing row。
# 不需要sqaure root(節省計算) # 不需要sqaure root。
# : 代表行,0:3代表列0、1、2。
umask = np. sum(云[:, 0: 3]**2, axis=1) < distance**2.
# umask是布爾陣列,只要它是假的,該云點就不會被顯示。
return cloud[umask] 。
uj5u.com熱心網友回復:
你就快到了。你可以添加或不添加z,我不確定我代表什么。
points = cloud[:,0:3]
points = np.sqrt(np.sum(np.square(point), axis=1)
points_filtered = points[points<=distance] 。
添加物是一個軸,用于沿著你的x、y和z值對每個點進行求和,并包括numpy中的過濾。points<=distance回傳一個bool陣列,作為掩碼使用。
uj5u.com熱心網友回復:
你可以向ndarray傳遞一個True False布爾的索引(或掩碼)作為選擇標準。 用你所展示的方法獲得與原點的距離。 只要把它擴展到在云計算陣列上逐行操作。 參見sum檔案,在axis下查找。 你想要的是每一行的總和,因為你已經用一個X,Y,Z,I作為一行來存盤資料。 如果你將來要轉置它,請使用 axis = 0 作為列。
dist = np.sqrt(np.sum(np. square(cloud[:,0:2]), axis = 1)
這將給你一個與你的點云中的點的數量一樣長的距離矢量。 現在用:
制作索引index = dist <= 10。
如果你列印這個索引,你會看到一系列的True False。 現在做過濾吧
filtered_cloud = cloud[index,:] 。
當然,還有那個永遠那么丑陋的單行線。 如果你這樣做......請發表評論,以便人們知道你做了什么。
filtered_cloud = cloud[np.sqrt(np.sum(np. square(cloud[:,0:2]), axis = 1) <= 10, :]
好奇的是,為什么只用x和y來表示距離?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/309369.html
標籤:
