2

我使用 Kinect Fusion 捕捉场景并从中获得一个 .OBJ 文件,其中包含顶点、顶点法线以及面。然后我需要根据这些信息检测大平面,以便我能够检测平面表面,如墙壁或地板(因为这些是大平面)。我创建了自己的数据结构来存储这些信息并使用 C# 对其进行编码。有谁知道我怎么能找到这些平坦的表面?

提前非常感谢大家!

4

1 回答 1

1

这不会是一个完整的答案,但它可能会给你一些想法。

我个人会尝试一些图像处理算法。第一个是区域增长。其次是种子填充。我认为您也会找到一些其他更适合分割的算法。

该方法起作用的关键是将人脸法线视为关键特征。如果两个相邻面具有足够相似(相同)的法线,则可以将它们视为同一曲面的一部分。

这里的类比是,您将用人脸法线替换像素强度,然后实现图像处理分割算法。

也许吧,但我怀疑它是否适用于所有情况,您可以索引法线,从而为每个法线分配它的索引,以替代像素强度。

编辑:

我的想法是,您拍摄场景快照并打开它,从而使其平整。从展开的网格中,您可以创建“颜色贴图”,方法是根据正常情况分配每个面颜色。也许您可以直接将法线转换为颜色 - 法线 (1,0,0) 将是 RGB 中的鲜红色。这个颜色贴图在 Graphics 中称为法线纹理,也许你可以直接从 kinect 中获取法线纹理。

然后在此颜色图中,您会发现具有相似/相同颜色的连接区域。这些区域是同一平面的一部分,因此是您想要的地板或墙壁。

我之前没有处理 3D 数据的经验,所以这只是我的猜测,但我认为它应该可以工作。至少在纸面上。:)

我实际上不知道哪些算法可以用于展开或获取正常纹理。但它应该给你一些方向。

于 2013-06-07T11:00:06.807 回答