【问题标题】:Feature tracking not working correctly on low Resolution images特征跟踪在低分辨率图像上无法正常工作
【发布时间】:2017-03-11 22:22:03
【问题描述】:

我正在使用 SIFT 进行特征检测,并使用 calcOpticalFlowPyrLK 进行图像中的特征跟踪。我正在处理从 Microsoft kinect 拍摄的低分辨率图像(裁剪后为 590x375)。

// feature detection
cv::Ptr<Feature2D> detector = cv::xfeatures2d::SIFT::create();
detector->detect(img_1,keypoints_1);
KeyPoint::convert(keypoints_1, points1, vector<int>());

// feature tracking
vector<float> err;
Size winSize=Size(21,21);
TermCriteria termcrit=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01);
calcOpticalFlowPyrLK(img_1, img_2, points1, points2, status, err, winSize, 1, termcrit, 0, 0.001);

我在同一摄像机位置以 30fps 的速度拍摄的稳定场景的连续图像(只是为了了解一下)上运行了这个。对眼睛来说,图像看起来是一样的,但不知何故 calcOpticalFlowPyrLK 无法跟踪从一张图像到另一张图像的相同特征。检测到的特征和跟踪的特征中的位置(x,y 坐标)应该相同。不知何故,它不是。

根据 AldurDisciple 的建议,我认为我将噪声检测为特征。下面的黑色图像是导电元素之间的差异,显示了噪声。接下来是原始图像,然后是检测到特征的图像。

我的目标是使用信息来发现机器人位置随时间的变化。

我用过

GaussianBlur( currImageDepth, currImageDepth, Size(9,9), 0, 0); 

噪音,但它没有帮助。

Find complete code in here

【问题讨论】:

  • 打印输入和输出点之间的距离(L2 范数),看看它们是否有意义。如果动作很小,您可以减小搜索窗口大小并检查。还要在图像中绘制 FAST 关键点,看看它们是否足以进行跟踪。
  • 我在检测到的坐标和跟踪的坐标之间画了线。当我移动相机时这是有道理的,但是当我不移动时,我仍然可以看到几行,这给了我错误的结果。我试着在检测到的点周围画圈,它们对我来说没有多大意义。
  • 当没有运动时,有多少点显示运动,它们的大小如何?也许您可以使用此信息来丢弃这些动作。无论如何,完全摆脱误报可能是不可能的。 FAST 旨在实时运行,可能不是很准确。使用 SIFT 或 SURF 等检测器并比较关键点的质量。如果您必须使用 FAST,则可以根据此比较调整 FAST 参数。
  • 我不确定哪个分数、幅度是重要的,但 Lucas kanade 将其作为光流中的运动进行跟踪。我在 FAST 旁边尝试了 goodfeaturestotrack 并调整了 FAST 参数,但效果不佳,我明天将尝试 SIFT 和 SURF。另外我使用的是 kinect 的 RAW 图像,我应该对其进行任何处理吗?

标签: opencv feature-detection opticalflow feature-tracking


【解决方案1】:

我认为您应该考虑两个因素:

  1. 您的场景基本上由 3 个同质区域组成,因此这些区域中的 FAST 点很可能是由图像中的噪声产生的。由于两个连续图像中的噪声模式可能完全不同,因此某些点的最佳匹配可能位于图像中完全不同的位置。

  2. 您的图像已经具有相当低的分辨率,calcOpticalFlowPyrLK 函数的参数列表中的3 意味着您需要该函数使用 4 级金字塔跟踪点。这意味着将首先在调整大小为 2^3 = 16 的图像(即 ~ 36x23 图像)中跟踪点,然后在调整大小为 2^2 = 8 的图像(即 ~ 73x46 图像)中跟踪点,依此类推.对于几乎没有纹理的图像来说,36x23 的初始分辨率太低了。

要解决您的问题,您可以尝试只使用两个金字塔级别(即传递1 而不是3)甚至是一个级别(即传递0 而不是3)。但请记住,噪音问题意味着通常您总会遇到一些错误匹配。

另一方面,在没有相机运动的静态场景中跟踪点似乎是一个人为的问题。在实际场景中,您可能对使用移动摄像机跟踪场景或静态场景中的运动更感兴趣,在这种情况下,使用多个金字塔级别会很有用。

【讨论】:

  • 我现在正在尝试对图像进行平滑处理,机器人在很多地方移动,图像就是示例之一。我的主要目标是跟踪运动,但我得到的稳定图像的值不为零,这让我认为我的运动结果也会有错误。机器人移动非常缓慢,并以 30FPS 的速度捕获图像。我处理图像,然后得到下一张,如果不可能,我不会处理所有图像。那么我应该使用多少个金字塔级别?我也用 SIFT 替换了 FAST 并现在尝试 SURF。我也可以访问深度图像,如果使用深度图像而不是当前的 RGB,它会工作吗?
  • 我在检测到的特征周围画了一个圆圈,它们大多在角落,或者两个平面相交的地方,很少(2-4)在同质区域。我减去了连续的图像,并在平面相遇或更暗的区域得到了一些噪声(非零值)。明天早上我会添加图片。
猜你喜欢
  • 2017-08-23
  • 2019-12-07
  • 2014-11-20
  • 1970-01-01
  • 2014-09-13
  • 2011-04-07
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
相关资源
最近更新 更多