goodFeaturesToTrack
生成,而第二组使用calcOpticalFlowPyrLK()
生成。然后使用这两组点,通过estimateAffine2DPartial()
估计一个转换矩阵,以便跟踪其缩放比例和旋转度。下面列出了代码段:
// Precompute image pyramids
maxLvl = cv::buildOpticalFlowPyramid(_imgPrev, imPyr1, _winSize, maxLvl, true);
maxLvl = cv::buildOpticalFlowPyramid(tmpImg, imPyr2, _winSize, maxLvl, true);
// Optical flow call for tracking pixels
cv::calcOpticalFlowPyrLK(imPyr1, imPyr2, _currentPoints, nextPts, status, err, _winSize, maxLvl, _terminationCriteria, 0, 0.000001);
// Get transformation matrix between the two data sets
cv::Mat H = cv::estimateAffinePartial2D(_currentPoints, nextPts, inlier_mask, cv::RANSAC, 10.0, 2000, 0.99);
然后使用H,使用perspectiveTransform()
映射掩蔽点。在最初的几十个帧中,结果似乎是准确的,直到当我跟踪的对象继续旋转时(通常在旋转变为> M_PI时),我注意到发生了一些漂移(就旋转而言)。老实说,我对问题的根源感到困惑,但是我主要怀疑的是,我的光通量窗口尺寸可能太小或太大。但是,调整窗口大小似乎无济于事,我的对象的位置仍然准确,但是估计的旋转(和比例)变得更糟。任何人都可以希望阐明这一点吗?
热烈的问候和感谢。
编辑:所附图片显示漂移问题
起始帧
前几帧-可以旋转
发生Z轴旋转漂移-看到锚线已向红色矩形漂移。
答案 0 :(得分:0)
Lucas Kanade跟踪器需要更多功能。猜猜您提供的跟踪模板还不够好。
(1)尝试使用其他功能丰富的真实图像吗?例如Opencv feautre tracking template image (2)定尺。由于您正在执行模拟,因此可以尝试先锚定大小。
calcOpticalFlowPyrLK被广泛用于视觉惯性状态估计研究。例如半直接视觉测距法或VINSMONO。您可以尝试在这些项目中找到代码,以了解其他人如何使用功能和参数