纹理对象的实时姿态估计

Real Time pose estimation of a textured object

我正在开发一个 AR 应用程序,其中标记是一个具有复杂形状的 3d 对象,因此我正在尝试制作一个基于 cad 的识别系统作为第一步。

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

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

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

提前致谢

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

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

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

"tricky"部分应该是针对给定的2D图像点和相机位姿计算物体3D点的坐标:

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

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

  • 使用内在矩阵将 2D 图像点转换为归一化相机帧 (z=1),参见 undistortPoints()
  • 测试当前2D图像点是否属于物体:当前相机位姿处图像光线与三角网格的交点(需要测试对于每个三角形)
  • 如果当前2D图像点属于物体,则对应的3D物体点(在物体框架中)可以是形成三角形的3个点中最近的点或你可以计算图像光线和三角形之间的交点