c# - 从 .OBJ 文件(从 Kinect Fusion 创建)检测大平面

标签 c# kinect

我使用 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/

相关文章:

c# - 在 C# 中创建 Websocket 服务器的最简单方法是什么?

c# - ASP.NET 烦人的 URL 编码字符串

c# - 创建拉伸(stretch) Canvas View 的方法

opencv - 使用 Openni 从 Kinnect 捕获 RGB 并使用 OpenCV 显示

c# - SubscribeOn() 在这里做什么?

python - 将kinect与处理和python一起使用

c# - 从文件到屏幕绘制骨骼动画

c# - 如何使用四元数旋转 3D 平面?

c# - 访问 Azure 应用服务中的 .cshtml 文件时出现路径错误