AKAZE 与 ORB 平面跟踪
在本教程中,我们将比较 AKAZE 与 ORB 局部特征,用它们在视频帧之间寻找匹配并跟踪物体运动。
算法流程如下:
- 在第一帧上检测并描述关键点,手动设置物体边界
- 对于后续每一帧:
- 检测并描述关键点
- 使用暴力匹配器进行匹配
- 使用 RANSAC 估计单应性变换
- 从所有匹配中筛选出内点
- 将单应性变换作用于边界框以定位物体
- 绘制边界框与内点,并将内点比率作为评估指标计算
要进行跟踪,我们需要一段视频以及物体在第一帧中的位置。
你可以从 这里 下载我们的示例视频与数据。
运行代码时,你必须指定输入(摄像头 ID 或 video_file)。然后用鼠标选择一个边界框,并按任意键开始跟踪:
./planar_tracking blais.mp4
代码见下方示例
Tracker 类
Section titled “Tracker 类”这个类使用给定的特征检测器与描述子匹配器,实现了上述算法。
- 设置第一帧
void Tracker::setFirstFrame(const Mat frame, vector<Point2f> bb, string title, Stats& stats) {first_frame = frame.clone();(*detector)(first_frame, noArray(), first_kp, first_desc);stats.keypoints = (int)first_kp.size();drawBoundingBox(first_frame, bb);putText(first_frame, title, Point(0, 60), FONT_HERSHEY_PLAIN, 5, Scalar::all(0), 4);object_bb = bb; } 我们从第一帧计算并存储关键点与描述子,并为输出做好准备。
我们需要保存检测到的关键点数量,以确保两种检测器找到的关键点数量大致相同。
- **处理帧**
1. 定位关键点并计算描述子(*detector)(frame, noArray(), kp, desc);
要在帧之间寻找匹配,我们必须先定位关键点。在本教程中,检测器被设置为在每一帧上寻找约 1000 个关键点。
1. 使用 2-NN 匹配器寻找对应关系matcher->knnMatch(first_desc, desc, matches, 2);for(unsigned i = 0; i < matches.size(); i++) { if(matches[i][0].distance < nn_match_ratio * matches[i][1].distance) { matched1.push_back(first_kp[matches[i][0].queryIdx]); matched2.push_back( kp[matches[i][0].trainIdx]); }}如果最近匹配比次近匹配近 *nn_match_ratio* 倍,则视为一次匹配。
1. 使用 *RANSAC* 估计单应性变换homography = findHomography(Points(matched1), Points(matched2), RANSAC, ransac_thresh, inlier_mask);如果至少有 4 个匹配,我们就可以使用随机抽样一致(RANSAC)来估计图像变换。
1. 保存内点for(unsigned i = 0; i < matched1.size(); i++) { if(inlier_mask.at<uchar>(i)) { int new_i = static_cast<int>(inliers1.size()); inliers1.push_back(matched1[i]); inliers2.push_back(matched2[i]); inlier_matches.push_back(DMatch(new_i, new_i, 0)); }}由于 *findHomography* 已经计算出内点,我们只需保存所选的点与匹配即可。
1. 投影物体边界框perspectiveTransform(object_bb, new_bb, homography);
如果内点数量合理,我们就可以使用估计出的变换来定位物体。
## 结果
你可以在 [youtube 上观看结果视频](http://www.youtube.com/watch?v=LWY-w8AGGhE)。
*AKAZE* 统计:Matches 626Inliers 410Inlier ratio 0.58Keypoints 1117ORB 统计:
Matches 504Inliers 319Inlier ratio 0.56Keypoints 1112