0

我正在使用 C++ 中的 OpenCV 在实时网络摄像头源上使用 AruCo 标记进行姿势估计。我的 fps 是 30,所以当我打印平移向量时,我得到平移向量的连续值,即每秒 30 个值。这些值是波动的,因此为了使其更稳定,我想平均前 30 个值,然后打印它,然后再打印下 30 个值,依此类推。怎么做?。我的代码如下

aruco::estimatePoseSingleMarkers(markerCorners, arucoSquareDimension, cameraMatrix, distanceCoefficients, rotationVectors, translationVectors);

    for (int i = 0; i < markerIds.size(); i++)
    {
        aruco::drawAxis(Croppedframe, cameraMatrix, distanceCoefficients, rotationVectors[i], translationVectors[i], 0.1f);

        cout << translationVectors[i] << "translation" << "vector" << markerIds[i] << endl;

    }
4

1 回答 1

1

如果translationVectors是具有 30 个翻译的向量作为 cv::Mat,您始终可以尝试简单的加法和除法来获得平均值:

cv::Mat accum(3,1,CV_64F, cv::Scalar::all(0.));
for( const auto& t: translationVectors)
{
  accum += t;
}
// avoid division by zero
if (!translationVectors.empty())
  accum /= translationVectors.size();

但是我建议你使用卡尔曼滤波器,它有助于使姿态估计稳定。如果不是这样,至少运行平均比采取 30 个姿势,然后是接下来的 30 个姿势更准确。

我没有测试过代码,但想法就在那里。如果您遇到问题,请评论答案,我会尽力为您提供更多帮助。

于 2018-06-18T11:20:09.653 回答