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