ISS (Intrinsic Shape Signature) 算法是一种用于点云特征提取的算法,通常用于检测点云中的关键点。关键点是点云中具有显著特征的位置,它们通常对于点云处理任务(如配准、分类、分割等)非常有用。
ISS 算法根据点云的曲率和法向量等信息,通过计算点云中每个点的 ISS 值来确定关键点。ISS 值越高,表示该点在点云中具有更显著的形状特征。
然而,ISS 算法并不仅限于关键点的检测。它也可以用于其他点云处理任务,例如特征匹配、特征描述等。ISS 算法提取的关键点可以作为点云中的参考点,用于计算点云之间的配准变换或描述点云的局部结构。
armadillo = o3d.data.ArmadilloMesh()
mesh = o3d.io.read_triangle_mesh(armadillo.path)
mesh.compute_vertex_normals()
pcd = o3d.geometry.PointCloud()
pcd.points = mesh.vertices
tic = time.time()
keypoints = o3d.geometry.keypoint.compute_iss_keypoints(pcd)
toc = 1000 * (time.time() - tic)
print("ISS Computation took {:.0f} [ms]".format(toc))
mesh.compute_vertex_normals()
mesh.paint_uniform_color([0.5, 0.5, 0.5])
keypoints.paint_uniform_color([1.0, 0.75, 0.0])
o3d.visualization.draw_geometries([keypoints, mesh], front=[0, 0, -1.0])
手册中给的代码示例有一个语法错误,在调用 o3d.visualization.draw_geometries
函数时出现了类型错误,这是因为open3d的更新导致的,front的参数类型不能这么写,解决办法很简单,把最后一行括号里的front=[0, 0, -1.0]删了就行,运行出来是这样
但是很显然,我们平时检测的物体可能没有这么复杂,需要设置参数使得提取的关键点数量变少,提升代码效率,节约成本,所以第一件事就会想到使用Python解释器在调用keypoints函数之前指定参数
parameters = o3d.geometry.keypoint.ISSKeypointEstimationParameters()
parameters.salient_radius = 0.1 # 调整为适当的值
parameters.non_max_radius = 0.05 # 调整为适当的值
parameters.gamma_21 = 0.5 # 调整为适当的值
parameters.gamma_32 = 0.9 # 调整为适当的值
keypoints = o3d.geometry.keypoint.compute_iss_keypoints(pcd, parameters)
不知道为什么,无论怎么指定都是没有用的,问这家伙,一个劲的给我道歉,态度贼好。
之后调查发现,作者提供了直接在函数里写参数的方式,直接敲就可以了
keypoints = o3d.geometry.keypoint.compute_iss_keypoints(pcd,
salient_radius=0.005,
non_max_radius=0.005,
gamma_21=0.5,
gamma_32=0.5)
但是这个参你就调去吧,一调一个不吱声
关键点显示不出来,等我显示出来就更新博客