Я делаю оценку позы с помощью маркеров AruCo, используя OpenCV на C ++ в режиме реального времени с веб-камеры. Мой 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.
Я не проверял код, но идея есть. Если вы столкнулись с проблемой, пожалуйста, прокомментируйте ответ, и я постараюсь помочь вам больше.
Других решений пока нет …