计算机视觉:在表面上生成液滴的 3D 模型
Posted
技术标签:
【中文标题】计算机视觉:在表面上生成液滴的 3D 模型【英文标题】:Computer Vision: Generating 3D model of droplet on a surface 【发布时间】:2019-03-11 12:38:57 【问题描述】:考虑一滴液体在一个水平面上。我需要通过从各个角度拍摄图像来生成液滴的 3D 模型。
假设:
液滴关于垂直轴对称。
理想的表面是平面和光滑的。
查询:
我需要多少张这样的图像才能处理 3D 模型?
我应该选择哪个方向的相机?
如何实现?
编辑:这是使用 DropSnake 插件拍摄的图像,用于测量液滴的接触角。但是,有人告诉我,校准需要花费大量时间和精力,否则可能会出现错误。大部分时间都用于实现完美对齐,而错误是由于阴影的干扰和液滴对光线的弯曲造成的。
我的方法:我们可以放置多个摄像头,从各个角度拍摄许多水滴照片,而无需校准。然后根据需要通过创建 3D 模型来提取有关接触角的信息。
DropSnake 提供的精度是 0.001 度,所以即使是 0.01 也可以。
【问题讨论】:
样本图像是您的问题的必要条件,因为它的内容将向我们展示您处理的内容以及要使用的算法和图像数量...您想要液滴或表面或两者都有网格?什么精度? @Spektre 我已经编辑了问题,请看一下。 【参考方案1】:恐怕在液滴边缘附近没有可锁定的特征,因此立体视觉是不可能的。这意味着您只需使用单个图像,相机垂直朝向液滴,如下所示:
您还应该在地板上放置一些标记或将相机放置在距液滴已知距离的地方以缓解这种情况。那么现在该怎么办:
提取液滴二维边缘像素
与您的图像中的红色或蓝色点完全相同。所以只需提取所有边缘点并理想地按角度对它们进行排序,以便它们形成折线轮廓......如果相机视图垂直于我们的液滴,那么轮廓将平行于相机焦平面,因此它的所有点都处于相同的垂直距离...这对于仅从单个图像转换为 3D 至关重要...
将轮廓转换为相对于相机的 3D
这是一个简单的数学运算,所以如果您看上面的图像,左侧是顶部概览,右侧是捕获的图像。让我们考虑捕获图像中的二维洋红色点(x,y)
。假设 3D 坐标系,其中点 (0,0,0)
是焦平面的中间(图像中心)Z 是距焦点的距离,x,y
方向与图像匹配。
所以我们可以使用三角形相似度将 2D (x,y)
转换为 3D:
(x - xs/2) / focal_length = X/distance
(y - ys/2) / focal_length = Y/distance
所以 3D 位置将是:
X = (x - xs/2) * distance / focal_length
Y = (y - ys/2) * distance / focal_length
Z = distance
创建网格
由于液滴是对称的,只使用一半的轮廓并简单地围绕液滴中心轴旋转 3D 轮廓,并将结果点重新排列成一些网格拓扑,形成 3D 液滴表面。或者只是计算每个轮廓点到轴的垂直距离,并将其用作参数圆方程的半径,并将网格计算为一组圆,每个 y
切片
精度取决于相机 FOV、分辨率和到液滴的距离。因此,如果还不够,您可以:
将相机放在离液滴更近的地方 使用更大分辨率的相机(或插值) 在提取轮廓时使用亚像素精度【讨论】:
我有一些疑问。 “xs-1”和“ys-1”是什么意思? (在右图中) 如果origin是右图的中心,为什么左上角写的是0? @SunitGautamxs,ys
是相机/图像分辨率,在图像上是角的像素位置,以 [像素] 为单位。对于 2D 图像和光栅 gfx 输出很常见,零是左上角(对于 OpenGL,它的左下角),因为我显示图像存储在内存或文件或其他任何东西中。您所指的原点是3D(不同的坐标系),原点位置应在相机的焦点或其投影znear平面上......但仍位于焦轴上......否则您无法转换像素位置稍后正确转换为角度和 3D 坐标...以上是关于计算机视觉:在表面上生成液滴的 3D 模型的主要内容,如果未能解决你的问题,请参考以下文章
国科大人工智能学院《计算机视觉》课 —三维视觉—相机模型与多视几何