OpenCV实时目标检测算法 Real_time_pose 解读

阅读Real time pose estimation of a textured object 相关文档

(把看的内容及时记录下来,真的可以帮助理清思路。虽然花费的时间比之前久了,但是相信慢慢习惯了就好了)
OpenCV的源码还是很友好的
借助这个例子,把之前综述里面看到的跟踪、位姿估计等内容全部都连成了一条线,理顺了!开心!

  1. Model registration类
    仅适用于缺少待配准对象的3D带纹理的模型的情况。可以使用这个项目创建自己的带纹理的3D模型,本项目仅对平面对象起作用。
    这个应用需要有对象的输入图片和它的3D纹理。
    首先从输入图片中提取ORB特征和描述符,然后使用trumbore_intersection_algorithm,将沿着上述算法得到的方向的网格来计算发现的特征的3D坐标。最后,这些3D点和描述符将存在一个文件中,不同列。
  2. Model_detection类
    基于3D带纹理模型,实时估计其位姿。
    从场景中,可以检测和提取到ORB特征和描述符。然后在model and scene描述符之间来寻找匹配。再根据寻找到的匹配,使用solvePnPRansac函数来求解相机的旋转矩阵和平移向量
    最后,使用一个卡尔曼过滤器来去除较差的位姿。
  3. 针对detection可执行文件的相关知识点进行解释
  4. Read 3D textured object model. 使用Model类中的load函数,从给定路径获取对应的内容,其内容包括:3D点以及其对应的描述符。其中yaml文件中有两列,一列为"points_3d",另一列为"descriptors",将读取到的值直接存入对应的成员变量中list_points3d_in和descriptors_。其中,Model类中有下述几个私有的成员变量
    OpenCV实时目标检测算法 Real_time_pose 解读_第1张图片
  5. Read object meshes. 使用Mesh类中的load函数。注意,此时使用的mesh文件的格式为ply。同理,直接使用读取进来的内容,对类成员变量赋值。下述除了id_,其余变量均可直接获得
    OpenCV实时目标检测算法 Real_time_pose 解读_第2张图片
  6. Take input from Camera or Video. 本处使用的视频为opencv给出的box.mp4。使用cv::VideoCapture类来读取。之后,对于每一帧进行处理
  7. Extract ORB features and descriptors from the scene. 检测场景的特征,并提取它的描述符。使用的是cv::ORB特征。在RobustMatcher类中有下述默认私有成员变量
    OpenCV实时目标检测算法 Real_time_pose 解读_第3张图片
  8. Match scene descriptors with model descriptors using Flann matcher. 这是检测过程的第一步。主要是将场景描述符与模型描述符进行匹配,从而知道当前场景中,发现的特征的3D坐标。使用的是cv::FlannBasedMatcher。然后调用匹配器的robustMatch()函数。robustMatch()函数首先计算模型的3D点(写作keypoints),然后对每个keypoints计算其对应的ORB描述符。使用对应Matcher中的函数knnMatch,对于model描述符和场景描述符,将二者交替作为查询集和训练集得到两个匹配变量matches12, matches21。之后,对于matches12, matches21,将NN比例大于阈值的匹配去除,并且去除两个中不对称的匹配。输出变量为good_matches
    OpenCV实时目标检测算法 Real_time_pose 解读_第4张图片
    上述匹配查找成功以后,就可以获得对应的3D点和2D点列表
  9. Pose estimation using PnP + Ransac. 由8我们得到了对应的2D-3D对,注意,此时使用的是solvePnPRansac()函数,因为在进行匹配之后,并不是所有的对应关系都是正确的,所以需要经过一系列的迭代过程来估计具体的参数。通过应用Ransac,所有outliers(即没有正确匹配关系的点对)将会被清除,然后再没有outliers的基础上,以一个特定的概率对相机位姿进行估计。使用了PnPProblems类,其中校正矩阵给定,为拍摄给定图片的相机的内参。
    OpenCV实时目标检测算法 Real_time_pose 解读_第5张图片
    为了保证实时性,本例中,使用的是Iterative方法,虽然EPNP和P3P的PnP方法速度更快,但是他们对于平面物体来说检验效果不强健。cv::solvePnPRansac()函数,根据给定的对象点集、对应的图片映射、相机矩阵和校正参数来估计一个对象的位姿。查找位姿的方法是最小化重投影误差(观察到的图片点,对象点进行投影后得到的点,两者之间距离的平方的和)(源码暂时没找到在那个目录下,,,等再深入学习以后填坑 已填坑,网址1 )
    OpenCV实时目标检测算法 Real_time_pose 解读_第6张图片
  10. Compute the 2D projection onto the image of a given 3D point 其中3D点是位于世界坐标系中,需要得到其在图片上的对应的坐标。这个仅仅是根据公式
    将3D点转化为2D点
    注意PnPProblem中的backproject3DPint()函数,会在模型网格对象的所有3D点上进行。
  11. Linear Kalman Filter for bad poses rejection. 解决的问题是,由于传感器误差,在检测或跟踪之后,结果交叉。所以,为了避免较差的检测效果,引入线性卡尔曼过滤器。KF将在一系列的inliers被检测到(使用RANSAC函数)以后被应用。
    状态向量为位置3D坐标、其一阶和二阶导数、使用3个欧拉角来表示旋转、其一阶和二阶导数,所以共3+23+3+23=18
    根据已经获得的旋转矩阵和平移向量,可以完善测量矩阵,后将其传入updateKalmanFilter函数中来更新KF。具体是:预测、根据输入的测量进行校正,用校正的结果来优化平移向量和旋转矩阵
  12. Set the estimated rotation-translation matrix. 即使用估计的旋转矩阵和平移向量,得到p矩阵
  13. Draw the found pose. 基于物体进行的是刚体运动,即尺寸、比例等不会发生改变,所以对于模型对象上的每一个点都具有相同的变换。所以,OpenCV中给出的方法是将坐标轴进行投影,来表示对象的位姿。这样就可以很方便的展现模型对应的变换情况
    对象位姿

你可能感兴趣的:(SLAM)