我正在开发一个特征跟踪应用程序,到目前为止,在尝试了几乎所有的特征检测器/描述符之后,我用 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”绘制的反应角似乎在振动。增加功能的数量已经减少了很多,但由于时间限制,我不能增加太多。
如何提高稳定性?
任何建议,将不胜感激。
谢谢。