我使用 Kinect Fusion 捕捉场景并从中获得一个 .OBJ 文件,其中包含顶点、顶点法线和面。然后我需要根据这些信息检测大平面,这样我就可以检测平面,例如墙壁或地板(因为这些都是大平面)。我创建了自己的数据结构来存储这些信息并使用 C# 对其进行编码。有谁知道我怎样才能找到这些平坦的表面?
在此先感谢大家!
最佳答案
这不是一个完整的答案,但它可能会给您一些想法。
我个人会尝试一些图像处理算法。第一个是区域增长。其次是种子填充。我认为您也会找到其他一些更适合分割的算法。
此方法起作用的关键是将面部法线视为关键特征。如果两个相邻的面具有足够相似(相同)的法线,则可以将它们视为同一表面的一部分。
这里的类比是,您将用人脸法线替换像素强度,然后实现图像处理分割算法。
也许吧,但我怀疑它是否适用于所有情况,您可以索引法线,从而为每个法线分配它的索引,这将替代像素强度。
编辑:
我的想法是,拍摄场景快照并将其展开,从而使其平坦。从展开的网格中,您可以创建“颜色贴图”,方法是根据每个面的法线分配颜色。也许你可以直接将法线转换为颜色——法线 (1,0,0) 在 RGB 中会是亮红色。这个颜色贴图在Graphics中称为normal texture,也许你可以直接从kinect中获取法线纹理。
然后在这张彩色 map 中,您会发现具有相似/相同颜色的连接区域。这些区域是同一平面的一部分,因此是您想要的地板或墙壁。
我之前没有处理 3D 数据的经验,所以这只是我的猜测,但我认为它应该可行。至少在纸面上。 :)
我实际上并不知道哪种算法适用于展开或获取法线纹理。但它应该会给你一些指导。
关于c# - 从 .OBJ 文件(从 Kinect Fusion 创建)检测大平面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16982055/