我使用 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);
噪音,但它没有帮助。