功能跟踪在低分辨率图像上无法正常工作

时间:2016-10-29 00:57:01

标签: opencv feature-detection opticalflow feature-tracking

我使用SIFT进行特征检测,使用calcOpticalFlowPyrLK进行图像中的特征跟踪。我正在研究从微软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 enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:3)

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

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

  2. 您的图片分辨率相当低,3函数参数列表中的calcOpticalFlowPyrLK表示您需要使用4级金字塔跟踪点的功能。这意味着将首先在图像中通过因子2 ^ 3 = 16(即~36x23图像)来跟踪点,然后在图像中通过因子2 ^ 2 = 8(即~73x46图像)调整大小等等。 。对于几乎没有纹理的图像,36x23的初始分辨率太低了。

  3. 要解决您的问题,您可以尝试仅使用两个金字塔等级(即通过1而不是3)或甚至一个等级(即通过0而不是{{ 1}})。但请记住,噪音问题意味着一般情况下你总会有一些错误的匹配。

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