文章目录
说在前面
- 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中的知识
关键点
- 在基于标记ar的原理部分我们知道要实现ar有三个重要的matrix,model、view、projection;现在已知model、projection,那么最主要的就是view matrix,即获取相机姿态(位置和朝向)
流程
-
确定并记录已知物体的特征描述
- feature detection & feature description
这些特征是图像中难以被噪声、亮度、缩放所影响的点;可以使用特征点检测算法例如SURF得到。(SURF算法优快云\博客园一大堆,就不提了)
feature detection
左:原图 右:使用SURF检测结果(辣鸡摄像头的盒子)
- feature detection & feature description
-
获取并记录相机捕获的每一帧的特征描述
使用同样的算法。
-
使用特征匹配算法对已知物的特征与当前帧的特征进行匹配
特征匹配算法:例如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 )
(有关单应性估计请自行寻找,一大堆)
-
相机姿态估计
现在,我们准备好了:
- 原图四个角点
- 相机捕捉的图像中对应的四个角点
以此来估计相机姿态,使用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,稳定性差强人意。