【OpenCV&OpenGL&Markerless AR】原理部分+代码

文章目录

  • 说在前面
  • 我理解的markerless ar
  • 涉及的OpenCV中的知识
  • 关键点
  • 流程
    • 确定并记录已知物体的特征描述
    • 获取并记录相机捕获的每一帧的特征描述
    • 使用特征匹配算法对已知物的特征与当前帧的特征进行匹配
    • 单应性估计
    • 相机姿态估计
  • Result
  • Code

说在前面

  • opencv版本:4.0.1
  • opencv aruco版本:4.0.1
  • opengl:使用glad、glfw
  • ar实现:基于无标记(markerless)
  • 基础:【OpenCV&OpenGL&Marker-based AR】原理部分
  • 其他说明:在AR学习中的一些理解;

我理解的markerless ar

  • 基于标记的ar是以标记为核心,模型相对于标记。
  • 基于无标记的ar则是以现实世界中的各种物体为核心,模型相对于物体。我们可以决定模型摆放在哪一个物体上。

涉及的OpenCV中的知识

  • 2D Features framework (feature2d module)
  • 啥都没有

关键点

  • 在基于标记ar的原理部分我们知道要实现ar有三个重要的matrix,model、view、projection;现在已知model、projection,那么最主要的就是view matrix,即获取相机姿态(位置和朝向)

流程

  • 确定并记录已知物体的特征描述

    • feature detection & feature description
      这些特征是图像中难以被噪声、亮度、缩放所影响的点;可以使用特征点检测算法例如SURF得到。(SURF算法CSDN\博客园一大堆,就不提了)
      feature detection
      【OpenCV&OpenGL&Markerless AR】原理部分+代码_第1张图片
      左:原图 右:使用SURF检测结果(辣鸡摄像头的盒子)
  • 获取并记录相机捕获的每一帧的特征描述

    使用同样的算法。

  • 使用特征匹配算法对已知物的特征与当前帧的特征进行匹配

    特征匹配算法:例如FLANN、BRUTEFORCE
    然后对这些特征点对进行精简
    (有关FLANN 匹配算法自行寻找,一大堆)

  • 单应性估计

    使用上面计算好的特征点对来计算单应性矩阵,使用单应性矩阵将左图四个角点转换到右图中(右图使用绿线将四个角点连接起来了);

    Mat cv::findHomography //返回单应性矩阵
    (
    InputArray srcPoints, //已知物体的特征点
    InputArray dstPoints, //捕获图像中的已经匹配到的特征点
    int method = 0, 
    double ransacReprojThreshold = 3, 
    OutputArray mask = noArray(), 
    const int maxIters = 2000, 
    const double confidence = 0.995 
    )
    

    (有关单应性估计请自行寻找,一大堆)

  • 相机姿态估计

    现在,我们准备好了:

    1. 原图四个角点
    2. 相机捕捉的图像中对应的四个角点

    以此来估计相机姿态,使用solvePnP函数

    bool cv::solvePnP 
    (
    //输入三维坐标,我们使用四个角点+z坐标0代替
    InputArray objectPoints, 
    //输入图像中对应的二维坐标,也就是2.
    InputArray imagePoints, 
    //相机内参矩阵,见marker-based ar原理部分
    InputArray cameraMatrix, 
    //相机畸变系数,见marker-based ar原理部分
    InputArray distCoeffs, 
    //输出,旋转向量,相机朝向
    OutputArray rvec,
    //输出,平移向量,相机位置 
    OutputArray tvec, 
    //不管
    bool useExtrinsicGuess = false, 
    不管
    int flags = SOLVEPNP_ITERATIVE 
    )
    

    由此,我们就解决了markless ar中最麻烦的相机姿态估计问题,可以愉快的ar了

Result

部分遮挡影响不大。

Code

  • github
    已知物体的图像可以自己拍一张;由于是个简单的demo,稳定性差强人意。

( o=^•ェ•)o ┏━┓

你可能感兴趣的:(AR)