我使用Kinect Fusion捕获场景并从中获取一个.OBJ文件,其中包含顶点,顶点法线以及面。然后,我将需要根据这些信息检测大的平面,这样我就可以检测到平面,例如墙壁或地板(因为这些是大的平面)。我已经创建了自己的数据结构来存储这些信息并使用C#对其进行编码。有谁知道我怎么能找到这些平面?
提前感谢你们所有人!
答案 0 :(得分:1)
这不是一个完整的答案,但它可能会给你一些想法。
我个人会尝试一些图像处理算法。第一个是区域增长。第二个是种子填充。我认为你也会找到一些其他更适合的分割算法。
此方法的关键是将面部法线视为关键特征。如果两个相邻的面具有足够相似(相同)的法线,则可以将它们视为同一表面的一部分。
这里打个比方,用脸面法线替换像素强度,然后实现图像处理分割算法。
也许,但我怀疑它适用于所有情况,你可以索引法线,从而为每个法线分配它将代替像素强度的索引。
修改强>
我的想法是,你拍摄场景快照并打开它,从而使它变平。从展开的网格中,您可以通过根据正常情况分配每个面部颜色来创建“颜色贴图”。也许你可以直接将法线转换为颜色 - 正常(1,0,0)将是鲜红色,RGB。这个颜色贴图在图形中称为普通纹理,也许你可以直接从kinect获得正常纹理。
然后在此颜色图中,您会发现具有相似/相同颜色的连接区域。这个区域是同一平面的一部分,因此是您想要的地板或墙壁。
我以前没有处理3D数据的经验,所以这只是我的猜测,但我认为它应该有效。至少在纸面上。 :)
我实际上并不知道哪种算法可用于展开或获得正常纹理。但它应该给你一些指示。