如何平均继续翻译向量

How to average continues translation vectors

本文关键字:翻译 向量 继续 何平      更新时间:2023-10-16

我正在使用 Open C++CV 在实时网络摄像头馈送上使用 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;
}

如果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 个姿势更准确的解决方案。

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