通过棱镜记录二维图像进行三维表面重建

19次浏览(最近30天)
你好,
我目前正在从事一个项目,涉及从一个2D图像重建一个3D表面。二维图像通过棱镜记录,产生两个不同角度的视图。所以我想知道的是下图中黑色标记的3d位置:
为了校准已知尺寸的物体,用相同的相机设置记录(见下文)。所以我认为在技术上应该有一种方法来使用从校准图像中已知的2D位置以及已知的3d位置和第一张图像中标记的2D位置来得到 3 d位置 第一幅图中的标记。
我已经尝试过使用三角函数和estimatecamerparameters函数,但这并不能工作,因为校准图像需要从几个不同的角度拍摄(而且它似乎也是一个略有不同的用例)。由于我是三维重建的新手,我将感谢任何帮助。
我需要的是上面图片中黑色标记物在其表面的3D位置。也就是说,我需要一些方法来得到变换函数 T 下面的图片底部和顶部的点如下:
T (calib2D_bottom, calib2D_top) = calib3D | T = ?
然后将它应用到上面的图像上,以获得实际表面上实际点的3D位置
T (points2D_bottom points2D_top) = points3D | points3D = ?
我也在帖子中添加了这个
谢谢你!
帕特里克

接受的答案

帕特里克·施莱格尔
帕特里克·施莱格尔 2021年8月19日
编辑:帕特里克·施莱格尔 2021年8月19日
好的,我会自己回答这个问题,因为我想我应该已经解决了:
本文提出了一种基于长方体/立方体的三维重建算法:
所以我所做的是首先根据已知的位置“估计”一个三维长方体。我估计并平均了x, y, z三个向量。我通过构造一个点p'间接地得到了z向量这个点p'就在平板凹槽中这些点的正上方,就像这样:
所以我得到了两个人造的立方体基于顶部和底部的图像,并得到了立方体的平均边长在2D像这样:
从那时起,我可以按照论文中描述的内容创建3D形状的第一个版本:
因为这仍然不是最优的,所以我接下来做的是创建一个真实的“世界坐标”的3D网格,并使用如下函数最小化重建的3D点和真实点之间的误差:
[squareError] = optimizeWithGlobals (F)
细化与fmin-search
Refined_F = fminsearch (@optimizeWithGlobals、ForRefinment_F选项);
我还采取了一些措施来防止它陷入局部极小值。并最终得到良好的重建(绿色的x为世界点,红色的是重建的):
注意边缘上的一些点有一点偏差(但都不超过0.2毫米)。这主要是因为我不能像网格图像中的其他点一样精确地设置这些点(稍后会修复):
还要特别感谢迈克尔,他在如何优化我的重建方面给了我一些建议
如果有人想知道关于这种方法的更多细节,可能会在以后的出版物中进行更详细的解释(如果我记得,我会在这里链接它)。此外,这里总是可以选择用问题进行注释(但不要期望快速响应时间)。
编辑:我忘了说这整个过程是用来优化F矩阵的,基本上就是我在最初的问题中提到的“函数T”:
T (calib2D_bottom, calib2D_top) = calib3D | T = ?
所以使用这个F矩阵,我现在应该能够重建表面,只要记录设置保持完全相同。

答案(1)

darova
darova 2021年8月5日
编辑:darova 2021年8月5日
试着这样做:
% [xw3,yw3,zw3] -白色标记的3D位置
% [xw2, yw2] -白色标记的2D位置
% [xb2, yb2] -黑色标记的2D位置
xb3 = griddata (, xw2, yw2 xw3 xb2 yb2);
yb3 = griddata (, xw2, yw2 yw3 xb2 yb2);
zb3 = griddata (, xw2, yw2 zw3 xb2 yb2);
如果有用就告诉我
1评论
帕特里克·施莱格尔
帕特里克·施莱格尔 2021年8月5日
第一,感谢您的回复。不幸的是,这并不起作用,因为网格数据基于白色标记的2D和3D位置估计一个表面,即它估计校准对象的表面,然后给出其他2D点的3D位置估计,如果它们位于该对象上,但它们不是。
我需要的是上面图片中黑色标记物在其表面的3D位置。也就是说,我需要一些方法来得到变换函数 T 下面的图片底部和顶部的点如下:
T (calib2D_bottom, calib2D_top) = calib3D | T = ?
然后将它应用到上面的图像上,以获得实际表面上实际点的3D位置
T (points2D_bottom points2D_top) = points3D | points3D = ?
我也在帖子中添加了这个

登录评论。

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!