这一节应该是本项目(Feature Tracking and Synchronous Scene Generation with a Single Camera)的最后一节了,实现了两种选取跟踪点和恢复跟踪的方法,顺便把AR物体换成了AR小游戏。
首先讲讲跟踪点的选取。之前的文章中我们选取ORB作为特征点检测的办法,然后手动选取N个ORB角点去利用LK光流法跟踪。这样的方法是事先定义好3D点的位置,比如正方形的四个角点(-1,-1,0),(1,-1,0),(1,1,0),(-1,1,0),然后在2D图像上手动的按顺序选取这么4个规则的2D点,然后把对应好的3D/2D点送到solvePnP函数里处理计算相机姿态。这样的方法好处是一开始我们就能手动确定一个平面,这个平面不一定平行于我们的相机,比较真实。而且可以手动控制solvePnP里处理的对应点对组数。缺点是事先定义好的3D点集合太有限,不能应对大千世界的种种。
与寻找2D点去对应定义好的3D点不同的是,我们先检测2D点,然后找一个点作为坐标原点,计算所有点到它的距离,除以一个值(大小根据远近而定)得到3D点的x,y坐标,z值为0. 这样我们也定义了一个平面,这个平面一开始是平行于我们的相机的,不太真实,但却能用于识别跟踪大千世界的种种。SolvePnP里的点对数较多,要注意根据情况持续作调整才行。这种计算3D点去对应检测到的2D点的方法利于之后我们提到的第二种特征点跟踪恢复的方法。
在具体讲述实现之前,我们先来改进一下ORB算法。根据GoodFeaturesToTrack函数中最小距离的应用,让我们想到将ORB算法做一个小小的处理。任意两个ORB角点之间最小距离为10,距离在10以内的点都被删除。实现过程类似于循环删除整形数组中的数指导任意两个数之间的距离都大于某一个值:
最小距离: 3
初始: 1 2 3 4 2 8 5 6 4 1 7 8 9 10 12
步骤1: 1 4 8 5 6 4 7 8 9 10 12
步骤2: 1 4 8 7 8 9 10 12
步骤3: 1 4 8 12
代码如下:
void DlimiteOrb(vector<Point2f>& inigoodfeatures)
{
vector<Point2f> newgoodfeatures;
Point2f temp1,temp2;
for(size_t i = 0;i<inigoodfeatures.