1

我正在开发一个特征跟踪应用程序,到目前为止,在尝试了几乎所有的特征检测器/描述符之后,我用 ORB 获得了最令人满意的整体结果。我的特征描述符和检测器都是 ORB。

我正在选择一个特定区域来检测源图像上的特征(通过遮罩)。然后将其与在后续帧上检测到的特征进行匹配。

然后我通过对从以下代码获得的“匹配”执行比率测试来过滤我的匹配:

std::vector<std::vector<DMatch>> matches1;

m_matcher.knnMatch( m_descriptorsSrcScene, m_descriptorsCurScene, matches1,2 );

我还尝试了双向比率测试(过滤从源到当前场景的匹配,反之亦然,然后过滤掉常见匹配)但它没有做太多,所以我继续进行单向比率测试。

我还在我的比率测试中添加了一个最小距离检查,它似乎可以提供更好的结果

if (distanceRatio < m_fThreshRatio && bestMatch.distance < 5*min_dist)
{
    refinedMatches.push_back(bestMatch);
}

最后,我估计了 Homography。

Mat H = findHomography(points1,points2);

我尝试使用 RANSAC 方法来估计内联,然后使用这些方法重新计算我的 Homography,但这会带来更多的不稳定性,而且会消耗更多的时间。

然后最后我在要跟踪的特定区域周围画了一个矩形。我通过以下方式获得平面坐标:

perspectiveTransform( obj_corners, scene_corners, H);

其中 'objcorners' 是我的蒙版(或未蒙版)区域的坐标。

我使用“scene_corners”绘制的反应角似乎在振动。增加功能的数量已经减少了很多,但由于时间限制,我不能增加太多。

如何提高稳定性?

任何建议,将不胜感激。

谢谢。

4

2 回答 2

1

如果振动对您来说真的很麻烦,那么您可以尝试对单应矩阵随时间取移动平均值:

cv::Mat homoG = cv::findHomography(obj, scene, CV_RANSAC);
if (homography.empty()) {
    homoG.copyTo(homography);
}
cv::accumulateWeighted(homoG, homography, 0.1);

将“单应性”变量设为全局变量,并在每次获得新帧时继续调用它。累积加权的 alpha 参数是移动平均线周期的倒数。

所以 0.1 取最后 10 帧的平均值,0.2 取最后 5 帧的平均值,依此类推......

于 2013-10-16T15:41:37.907 回答
0

从特征检测/匹配的经验中想到的一个建议是,有时您只需要接受匹配的特征点就不能完美地工作。即使您正在查看的场景中的细微变化也会导致一些烦人的问题,例如光线变化或进入视野的不需要的物体。

在我看来,从你所说的来看,你有一个体面的工作特征匹配,你可能想研究一种保持感兴趣区域不变的方法。如果您知道您尝试在帧之间跟踪的任何对象的典型速度或任何其他独特的运动模式,或者与相机位置相关的任何约束,那么它可能有助于避免重新计算不必要地导致振动的感兴趣区域。或者实际上它可能有助于创建更有效的搜索算法,允许您增加可以检测和使用的特征点的数量。

如果前一个窗口的大小和位置相似,您可以使用的另一个(小)技巧是避免重绘区域窗口。

于 2013-07-22T14:22:36.030 回答