Opencv 纹理对象的实时姿态估计

Opencv 纹理对象的实时姿态估计,opencv,3d-reconstruction,Opencv,3d Reconstruction,我正在开发一个AR应用程序,其中的标记是一个具有复杂形状的3d对象,因此我尝试制作一个基于cad的识别系统作为第一步 据我所知,从一组图像构建3d模型的主要步骤是: 1-循环浏览图像并提取其特征。 2-执行成对匹配 3-计算每个图像的3d点及其相应描述符和相机参数 现在我的第一个问题是我应该如何确定每个3d点的描述符,因为我们知道3d点是从一组相似的2d特征中提取的,这意味着有许多相似的描述符,每个描述符对应一个2d点,那么我们应该选择哪一个描述符?它们并不完全相同,而是略有不同 我的另一个问题

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

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

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

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


提前感谢

快速回答,以下是您需要的:

  • 具有纹理对象的CAD模型
  • “了解”关键点:
    • 对于每个“训练”图像,检测并保留图像上检测到的关键点
    • 对于每个2D关键点,使用3D CAD网格计算相应的3D对象坐标,并提取相应的描述符
    • 将三维对象坐标列表和相应的描述符列表保存在文件中
  • 要检测对象,请执行以下操作:
    • 检测所需图像中的关键点
    • 将当前关键点与保存的关键点匹配
    • 使用带有
      solvePnPRansac()
      的稳健方法(RANSAC)估计对象姿势:3D对象点是在训练步骤中保存的3D对象坐标,2D图像点是当前检测和匹配的关键点的2D图像坐标
教程应该或多或少做一些类似的事情

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

  • 您可以在OpenCV教程中看到如何对纹理对象进行实时姿势估计
对于2D图像点(例如,一个关键点位置),我会做什么(可能与教程代码稍有不同):

  • 使用内在矩阵将2D图像点转换为标准化相机帧(
    z=1
    ),请参见
  • 测试当前2D图像点是否属于对象:图像光线与当前摄影机姿势下三角形网格的交点(需要对每个三角形进行测试)
  • 如果当前二维图像点属于对象,则相应的三维对象点(在对象帧中)可以是构成三角形的3个点中最近的点,也可以计算图像射线和三角形之间的交点

谢谢您的回答!如果您能为我澄清这一步骤“对于每个2D关键点,使用3D CAD网格计算相应的3D对象坐标,并提取相应的描述符”,并在中进行解释,我将不胜感激details@Lisa.s我已经完成了我的回答。不幸的是,这个话题需要一些数学知识,我没有时间详细说明我的答案。如果需要更多信息,请参见齐次变换,了解如何将一帧中的3D点变换为另一帧(最后只是矩阵乘法),透视相机模型和一些直线与三角形相交的几何图形。很抱歉打扰您@Catree我仍然有一个想法,希望您能帮助我“将3D对象坐标列表和相应描述符列表保存在文件中”,如果同一3D坐标被多次存储,在其中一个训练图像中,每个都有一个关键点的对应描述符?或者有没有办法只为一个3d坐标选择一个描述符?@Lisa.s在我看来,用相应的描述符存储相同3d对象坐标的倍数应该不是问题。执行特征匹配时,将尝试将当前图像中的关键点与训练图像中检测到的关键点进行匹配。这将降低姿势估计方法具有相同3D对象坐标的概率。此外,RANSAC姿态估计应该考虑这些点作为离群点。首先,我想说谢谢和抱歉打扰你@ CalRe,所有的东西现在对我来说是清楚的,除了一点,为了猜测2D - 3D通信(在学习步骤)我需要知道相机姿势!在本教程中,他们手动插入了8个点,这些点决定了立方体结构,并依靠它们来获得姿势,但对于更复杂的对象,例如玩偶或3d环境,如何在学习步骤中确定相机姿势和图像,以便执行重新投影并获得与3d点对应的描述符?