如何在OpenCV中提高estimateAffine2D(或estimageRigidTransform)的准确性?

时间:2019-05-20 23:54:13

标签: c++ opencv

我有两组点,一组是从时间t-1到当前时间t。第一组使用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时),我注意到发生了一些漂移(就旋转而言)。老实说,我对问题的根源感到困惑,但是我主要怀疑的是,我的光通量窗口尺寸可能太小或太大。但是,调整窗口大小似乎无济于事,我的对象的位置仍然准确,但是估计的旋转(和比例)变得更糟。任何人都可以希望阐明这一点吗?

热烈的问候和感谢。

编辑:所附图片显示漂移问题

Starting Frame

起始帧

First few frames -- Rotation OK

前几帧-可以旋转

Z-Rotation Drift occurs -- See Anchor Line

发生Z轴旋转漂移-看到锚线已向红色矩形漂移。

1 个答案:

答案 0 :(得分:0)

Lucas Kanade跟踪器需要更多功能。猜猜您提供的跟踪模板还不够好。

(1)尝试使用其他功能丰富的真实图像吗?例如Opencv feautre tracking template image (2)定尺。由于您正在执行模拟,因此可以尝试先锚定大小。

calcOpticalFlowPyrLK被广泛用于视觉惯性状态估计研究。例如半直接视觉测距法或VINSMONO。您可以尝试在这些项目中找到代码,以了解其他人如何使用功能和参数