Skip to content

AKAZE 与 ORB 平面跟踪

在本教程中,我们将比较 AKAZE 与 ORB 局部特征,用它们在视频帧之间寻找匹配并跟踪物体运动。

算法流程如下:

  • 在第一帧上检测并描述关键点,手动设置物体边界
  • 对于后续每一帧:
    1. 检测并描述关键点
    2. 使用暴力匹配器进行匹配
    3. 使用 RANSAC 估计单应性变换
    4. 从所有匹配中筛选出内点
    5. 将单应性变换作用于边界框以定位物体
    6. 绘制边界框与内点,并将内点比率作为评估指标计算

要进行跟踪,我们需要一段视频以及物体在第一帧中的位置。

你可以从 这里 下载我们的示例视频与数据。

运行代码时,你必须指定输入(摄像头 ID 或 video_file)。然后用鼠标选择一个边界框,并按任意键开始跟踪:

./planar_tracking blais.mp4

frame.png

代码见下方示例

这个类使用给定的特征检测器与描述子匹配器,实现了上述算法。

  • 设置第一帧
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 626
Inliers 410
Inlier ratio 0.58
Keypoints 1117

ORB 统计:

Matches 504
Inliers 319
Inlier ratio 0.56
Keypoints 1112