【问题标题】:How to improve accuracy of estimateAffine2D (or estimageRigidTransform) in OpenCV?如何提高 OpenCV 中estimateAffine2D(或estimageRigidTransform)的准确性?
【发布时间】:2019-10-07 07:52:56
【问题描述】:

我有两组点,一组来自时间 t-1 和当前时间 t。第一组是使用goodFeaturesToTrack 生成的,而后者是使用calcOpticalFlowPyrLK() 生成的。使用这两组点,然后我通过estimateAffine2DPartial() 估计一个变换矩阵,以便跟踪它的缩放和旋转。代码sn-p如下:

// 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)时发生了一些漂移(在旋转方面)。老实说,我不知道罪魁祸首在哪里,但我的主要怀疑可能是我的光流窗口尺寸可能太小或太大。但是,调整窗口大小似乎没有帮助,我的对象的位置仍然准确,但估计的旋转(和比例)变得更糟。任何人都可以希望对此有所了解吗?

热烈的问候和感谢。

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

起始帧

前几帧——旋转OK

Z-Rotation Drift 发生 - 看到锚线已向红色矩形漂移。

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

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

    (1) 尝试其他功能丰富的真实图像?例如Opencv feautre tracking template image (2)固定规模。由于您在进行模拟,因此您可以尝试先锚定尺寸。

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

    【讨论】:

    • 我想你是对的,尽管我希望这个模板能够为 OpenCV 提供足够的角点,以便随着时间的推移正确估计其仿射变换。我需要做更多的测试。
    猜你喜欢
    • 2016-04-02
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2020-12-08
    • 2020-03-26
    相关资源
    最近更新 更多