- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
为了提高 python 脚本的效率,我尝试使用 Numpy 来转换基于点云上大量“for 循环”操作的脚本,以加快该过程。
简而言之,我有一个 3d 模型,表示为包含在 np.array 中的一组 3d 点(x,y,z 坐标)(维度:(188706, 3))
[[168.998 167.681 0.] <-- point 1
[169.72 167.695 0.] <-- point 2
[170.44 167.629 0.] <-- point 3
...
[148.986 163.271 25.8] <-- point 188704
[148.594 163.634 25.8] <-- point 188705
[148.547 163.667 25.8]] <-- point 188706
每对 [[row x-1][row x]] 代表 3D 中的一个段
[[168.998 167.681 0.] [169.72 167.695 0.] <-- SEGMENT 1 (points 1 & 2)
[169.72 167.695 0.] [170.44 167.629 0.] <-- SEGMENT 2 (points 2 & 3)
[170.44 167.629 0.] [171.149 167.483 0.] <-- SEGMENT 3 (points 3 & 4)
...
[149.328 162.853 25.8] [148.986 163.271 25.8] <-- SEGMENT 94351 (points 188703 & 188704)
[148.986 163.271 25.8] [148.594 163.634 25.8] <-- SEGMENT 94352 (points 18874 & 188705)
[148.594 163.634 25.8] [148.547 163.667 25.8]] <-- SEGMENT 94353 (points 188705 & 188706)
我的目标是测量每个有序点//行对之间的欧几里德距离(=每个线段的长度),以便我可以检测到需要在哪里添加更多点来表示更多的 3d 表面模型。换句话说,如果段长度高于阈值 (=0.5mm),我将必须用更多点离散化该特定段,并将这些附加点添加到我的点云中。
借助以下代码,我找到了一种递归测量每行之间的欧几里得距离的方法:
EuclidianDistance = np.linalg.norm(PtCloud[:-1] - PtCloud[1:],axis=1)
这给出了这个结果:
[0.72213572 0.72301867 0.72387637 ... 0.54008148 0.5342593 0.05742822]
我还发现了如何根据线段的顶点(末端)对线段进行离散化:
def AddEquidistantPoints(p1, p2, parts):
return np.stack((np.linspace(p1[0], p2[0], parts + 1), np.linspace(p1[1], p2[1], parts + 1)), axis=-1)
if EuclidianDistance > 0.5mm:
dist = AddEquidistantPoints(currentRow, previousRow, 10) #10 --> nb subdivisions
但我的第一个问题是那些欧几里德距离只能在 z 坐标相等的点上计算。当 z 坐标不等于时我是否需要分割数组?与:
PtCloud = np.split(PtCloud, np.where(np.diff(PtCloud[:,2])!=0)[0]+1)
这给了我一个数组列表,所以我想我将不幸地使用 for 循环......
我的第二个问题与递归检查和离散化步骤有关,因为我不知道如何在这种特殊情况下实现它。我想知道是否有一种方法可以在没有任何 for 循环的情况下做到这一点。
因此,如果有人能帮助我解决这个挑战,我将非常高兴,因为我目前“陷入困境”。这对我来说开始变得非常具有挑战性。
提前致谢,埃尔维
最佳答案
只是与您分享,我刚刚找到了解决我的问题的方法。这可能不是最有效的方法,但它确实有效。
import numpy as np
print("====================")
print("Initial Points Cloud")
print("====================")
POINTCLOUD = np.array([[168.998, 167.681, 0.],
[169.72, 167.695, 0.],
[170.44, 167.629, 0.],
[171.149, 167.483, 0.],
[150.149, 167.483, 4.2],
[160.149, 167.483, 4.2],
[159.149, 166.483, 4.2],
[152.149, 157.483, 7.],
[149.328, 162.853, 25.8],
[148.986, 163.271, 25.8],
[148.594, 163.634, 25.8],
[180.547, 170.667, 25.8],
[200.547, 190.667, 25.8]])
print(POINTCLOUD)
print("============================================")
print("Reshaped Point Cloud in the form of segments")
print("============================================")
a = np.column_stack((POINTCLOUD[:-1],POINTCLOUD[1:]))
print(a)
b = a.reshape((a.shape[0],2, 3))
#print(b)
print("")
print("*******************************")
print("Non filtered euclidean distance")
print("*******************************")
EuclidianDistance = np.transpose(np.linalg.norm(b[:,0] - b[:,1],axis=1))
print(EuclidianDistance)
print("")
print("****************")
print("Mask computation")
print("****************")
mask = np.transpose([a[:,2] == a[:,5]])
mask2 = [a[:,:] == a[:,:]]*np.transpose([a[:,2] == a[:,5]])
print("")
print(mask2)
print("")
print("***********************************")
print("1rst Filter applyed on points cloud")
print("***********************************")
# b = np.where(mask2,a,0)
# b = np.squeeze(b, axis=0)
b = np.squeeze(np.where(mask2,a,0), axis=0)
print(b)
print("")
b2 = b[np.squeeze(mask2,axis=0),...].reshape((np.sum(mask),b.shape[1]))
print(b2)
print("")
#print(b2.reshape(b2.shape[0],2, 3))
b = b2.reshape(b2.shape[0],2, 3)
print("")
print("***************************************")
print("FIRST EUCLIDEAN DISTANCE FILTERING STEP")
print("***************************************")
EuclidianDistance = np.linalg.norm(b[:,0] - b[:,1],axis=1)
print(EuclidianDistance)
print("")
print("***************************")
print("# THRESHOLD MASK GENERATION")
print("***************************")
threshold = 7
mask_threshold = np.transpose(EuclidianDistance>threshold)
print(mask_threshold)
print("")
print("**********************************")
print("# FINAL FILTERED ECLIDEAN DISTANCE")
print("**********************************")
EuclidianDistance = EuclidianDistance[np.squeeze(mask_threshold),...]
print(EuclidianDistance)
print("")
print("**********************")
print("SEGMENTS TO DISCRETIZE")
print("**********************")
SegmentToDiscretize = b[np.squeeze(mask_threshold),...]
print(SegmentToDiscretize)
print("")
print("******************************")
print("EQUIDISTANT POINTS COMPUTATION")
print("******************************")
nbsubdiv2 = np.transpose(np.ceil(np.array(np.divide(EuclidianDistance,0.7))).astype(int)).reshape((SegmentToDiscretize.shape[0],1))
print(nbsubdiv2)
print(nbsubdiv2.shape)
print(nbsubdiv2[1,0])
print(SegmentToDiscretize.shape)
print(SegmentToDiscretize[:,0])
nbsubdiv = [10,30,10]
addedpoint = np.linspace(SegmentToDiscretize[:,0],SegmentToDiscretize[:,1],nbsubdiv[0], dtype = np.float)
addedpoint = addedpoint.reshape((addedpoint.shape[0]*addedpoint.shape[1],3))
print(np.sort(addedpoint,axis=0))
print("")
print("***********************************")
print("UPDATED POINT CLOUD WITH NEW POINTS")
print("***********************************")
# duplicates are removed with the command np.unique
POINTCLOUD = np.unique(np.append(POINTCLOUD,addedpoint, axis=0),axis=0)
print(POINTCLOUD)
print("")
print("************************")
print("FINAL SORTED POINT CLOUD")
print("************************")
sortedPOINTCLOUD = POINTCLOUD[np.argsort(POINTCLOUD[:, 2])]
print(sortedPOINTCLOUD)
print("***************************")
如果您愿意,请随时添加您自己的建议来改进它。我们将非常欢迎!
关于python - 如果段长度高于特定值,如何递归离散化段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60288272/
如何在 Flutter 中使 slider 离散看起来像上图? slider discrete 最佳答案 使用 divisions Slider 的属性(property)小部件将其分成相等的部分,然
我正在创建一个带有颜色条的散点图 plt.scatter(X, Y, c=Z) plt.colorbar() plt.show() plt.close() 其中 X 和 Y 是 float 组,Z 是
我刚刚在 android studio 中发现了 seekbar 离散小部件,我发现它非常有用,但我不知道如何删除步骤指示器,或者用更合适的可绘制对象更改它们。 有人设法做到了吗? 这是我当前搜索栏的
问题 请注意以下问题:巫师可以创建和销毁 rune 。创建一个新的 rune 需要消耗与先前创建的 rune 数量成比例的法力。摧毁 rune 会恢复创建 rune 所用的法力。下面,我提出一个可能的
我正在尝试使用 ggplot2 中的 sf 和 geom_sf 制作 map ,其中一组点数据使用连续颜色比例(-1 到 1),一组线数据使用离散比例(a、b、c、d)着色。但是,当我在同一张 map
我正在尝试在具有连续状态(dim.= 20)和离散操作(3 个可能的操作)的环境中找到最佳策略。并且有一个特定的时刻:对于最佳策略,一个操作(称为“操作 0”)的选择频率应比其他两个操作高得多(频率约
仅使用 x-y 位置移动绘制圆弧的最佳方法是什么?例如,假设我想在点 (4,4) 处绘制一个半径为 4 的圆。让我们看看我的“抽屉”从 (4,0) 开始,每个方向的分辨率为 0.1 步。我将如何创建一
我正在使用一个使用广义加法模型的随机站点级效应来拟合一个模型,该模型在 mgcv 中实现。 R 包。我一直在使用函数 gam() 执行此操作但是,为了加快速度,我需要转到 bam()框架,与gam()
这个问题在这里已经有了答案: Make a line separated by group in bar chart (3 个答案) 关闭上个月。 我正在尝试使用 ggplot2 在条形图的每个条上
这个问题在这里已经有了答案: Make a line separated by group in bar chart (3 个答案) 关闭上个月。 我正在尝试使用 ggplot2 在条形图的每个条上
是否可以同时使用 Intel HD 4000 集成显卡和独立 GPU,OpenCL(或 CUDA)作为设备,CPU 作为主机?我想要一些代码在集成显卡上运行,而其他代码同时在我的 GPU 上运行。 最
我是一名优秀的程序员,十分优秀!