物体识别是深度相机的应用方向之一,根据本工作已经做了平面、球体、圆柱体的识别算法,在这些算法中,点云必须属于单一物体,不能同时存在多个物体。这个要求并不符合实际应用,因为在实际中,被深度相机观测的物体往往是放置于台面、地面、支架上,或者同时存在多个物体,比如放在桌上的一筐苹果,这就产生了多物体识别的问题。
本工作中,多物体识别在算法层面采用RANSAC方法,程序层面采用CGAL库。感谢CGAL的支持,可以对包括平面、球、圆柱、圆锥、甜甜圈等几何体进行识别,并且能够实现多物体的识别。
三维散点图可以直观地展示多物体识别的效果,本工作使用Python的scatter函数实现。
# figure
fig = plt.figure(dpi=128,figsize=(8,8))
ax = fig.add_subplot(111, projection='3d')
for i, name in enumerate(ShapeList):
print('shapeName:',name)
XCur = []
YCur = []
ZCur = []
for j, nameCur in enumerate(ShapeName):
if name==nameCur:
XCur.append(X[j])
YCur.append(Y[j])
ZCur.append(Z[j])
XCur = np.array(XCur)
YCur = np.array(YCur)
ZCur = np.array(ZCur)
# Random sampling
#size = int(len(XCur)/2)
#index = np.random.choice(XCur.shape[0], size, replace=False)
#XCur = XCur[index]
#YCur = YCur[index]
#ZCur = ZCur[index]
# draw
ax.scatter(XCur, YCur, ZCur, s=5, cmap="jet", marker="o", label=name)
# set lable
ax.set_xlabel('X', fontsize=10)
ax.set_ylabel('Y', fontsize=10)
ax.set_zlabel('Z', fontsize=10)
# set limits
#ax.set_xlim(-200, 200)
#ax.set_ylim(-200,200)
#ax.set_zlim(-150, 50)
# draw
ax.scatter(XCur, YCur, ZCur, s=5, cmap="jet", marker="o", label=name)
# set lable
ax.set_xlabel('X', fontsize=10)
ax.set_ylabel('Y', fontsize=10)
ax.set_zlabel('Z', fontsize=10)
# set limits
#ax.set_xlim(-200, 200)
#ax.set_ylim(-200,200)
#ax.set_zlim(-150, 50)
# set title
plt.title('Shape Detection', fontsize=10)
# overlapping
plt.tight_layout()
# legend
plt.legend()
# save figure
plt.savefig('figure_step5_shapeDetection.png')
# print figure on screen
plt.show()
效果如图