【发布时间】:2014-07-16 15:49:52
【问题描述】:
我有一张使用 3D CAD 数据生成的深度图像。该深度图像也可以从深度成像传感器(例如 Microsoft Kinect 或任何其他立体相机)中获取。所以基本上它是成像视图中可见点的深度图。换句话说,它是从某个视图中分割出的对象的点云。
我想确定(估计也可以)每个点的表面法线,然后找到该点的切平面。
我该怎么做?我做了一些研究,发现了一些技术,但没有很好地理解它们(我无法实现它)。更重要的是如何在 Matlab 或 OpenCV 中做到这一点?我无法使用surfnorm 命令来做到这一点。 AFAIK 它需要一个表面,我的深度图像中有部分表面。
这是一个示例深度图像。
[编辑]
我想要做的是,在获得每个点的表面法线后,我将在这些点创建切平面。然后使用这些切平面通过取相邻点到切平面的距离之和来确定该点是否来自平坦区域。
【问题讨论】:
-
如何定义深度不连续点的表面法线?
-
哦,你的意思是像边缘这样的点,或者在这张图片中在杯子内部可见的底部?好吧,如果它存在不连续性,那么表面法线对我来说并不重要。所以我不需要定义它。
-
你试过只取相邻像素的有限差分吗?结果可能会很嘈杂,需要进行一些平滑处理,而且您需要做一些事情来处理不连续性,但它应该为您提供足够好的照明效果。你需要法线做什么?
-
不知道什么是有限差分,所以没试过。我会调查的。我不会对闪电使用法线,在获得法线后,我将计算那个点的切线表面。然后使用该表面通过取相邻点到该表面的距离之和来确定该点是否平坦。简单地说,我试图了解对象上选择的点是否来自平面。
-
这个想法是您需要定义可以计算表面法线的区域。通常在计算机图形学中,三角形是最常用的多边形,其中法线由cross product of the two non-parallel sides 计算。但是,出于实施目的,我建议您查看this code from OpenGL forums。 HTH
标签: matlab opencv graphics 3d computer-vision