纹理对象的实时姿势估计

时间:2017-06-23 10:51:43

标签: opencv 3d-reconstruction

我正在研究AR应用程序,其中标记是具有复杂形状的3d对象,所以我试图将基于cad的识别系统作为第一步。

据我所知,从一组图像构建3d模型的主要步骤是: 1 - 循环图像并提取其功能。 2 - 执行成对匹配 3 - 计算每个图像的3d点及其相应的描述符和相机参数。

现在我的第一个问题是我应该如何确定每个3d点的描述符,因为我们知道3d点是从一组类似的2d特征中提取的,这意味着每个特征都有许多相似的描述符其中对应于2d点,我们应该选择哪些描述符?它们并不完全相同,而是彼此略有不同。

我的另一个问题是: 基于OpenCV提供的本教程Real Time pose estimation of a textured object ,要求模型采用.yaml格式,网格采用.ply格式。 我需要知道如何将我的3D结构存储到这些类型的文件中? 是否有任何可以帮助这样做的步骤或工具?

提前致谢

1 个答案:

答案 0 :(得分:1)

快速回答,这些是您应该需要的:

  • 具有纹理对象的CAD模型
  • "学习"关键点:
    • 每个"培训"图像,检测并保留图像上检测到的关键点
    • 对于每个2D关键点,使用3D CAD网格计算对应的3D对象坐标并提取相应的描述符
    • 在文件中保存3D对象坐标列表和相应的描述符列表
  • 检测对象:
    • 检测所需图像中的关键点
    • 将当前关键点与保存的
    • 相匹配
    • 使用具有solvePnPRansac()的鲁棒方法(RANSAC)估计对象姿势:3D对象点是在训练步骤中保存的3D对象坐标,2D图像点是当前检测到的关键点的2D图像坐标和匹配

教程应该或多或少地做类似的事情。

"棘手"部分应该是计算给定2D图像点和相机姿势的对象3D点的坐标:

  • 您可以在OpenCV教程中看到here如何完成它在纹理对象的实时姿势估计

对于2D图像点(例如一个关键点位置),我会做什么(可能与教程代码有点不同):

  • 使用内在矩阵将2D图像点转换为规范化相机帧(z=1),请参阅undistortPoints()
  • 测试当前2D图像点是否属于对象:图像光线与当前相机姿势处的三角形网格之间的交点(您需要为每个三角形测试它)< / LI>
  • 如果当前的2D图像点属于对象,则相应的3D对象点(对象框中的 )可以是形成三角形的3个点的最近点,或者可以计算交点图像光线和三角形之间的点