相机姿态轨迹最小二乘多项式平滑优化(防抖动)

2023-11-07 21:10

本文主要是介绍相机姿态轨迹最小二乘多项式平滑优化(防抖动),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇讲了利用随即一致性来减少错误匹配的情况,这一篇讲一下使用最小二乘多项式平滑方法来减少姿态的抖动问题。因为我们的设备是手持单目,相机在移动的过程中,会产生细微的抖动。虽然EKF或者G2O(通用图优化)会帮我们最小化错误,但是当我们得到正确的最接近真实的姿态后,我们会发现这些姿态是存在细微抖动的。下图为未平滑的相机姿态(Matlab):

我们看到有大量的抖动在里面。体现在图像上则是AR物体会有小幅度的波动。这个波动其实很小,如果AR物体比较小的话,这个波动是不明显的(肉眼几乎察觉不到)。但是当我们拉远距离,呈现很大的AR物体时(如车展上的汽车),这个波动肉眼还是能察觉到。另外现在的VR/AR系统里,减小眩晕感是很重要的,所以有必要使呈现出的虚拟物体更加的稳定。因为AR系统是实时的,而复杂的滤波或者平滑方法会消耗更多的时间,所以我们采用基础的最小二乘法来消除抖动。这种方法参数少,计算量小,速度快,平滑效果不错。完整的名字是最小二乘移动窗口多项式平滑,我们用周围多个带有不同权重的点来表示其中的一个点,合理的选择平滑窗口的大小和多项式的次方数,对于消除抖动的效果和时间消耗极为重要。对于平滑后的数据与原始数据之间的误差,我们做了相应的数据补偿。

首先来看看最小二乘多项式平滑中最重要的两个参数:平滑窗口大小2m+1,多项式次数n。如下图所示:

我们先来计算一下m=2(移动窗口大小为5),n=2情况下的权重(系数)矩阵:

方程组(14)可以被表示成矩阵形式(15),然后利用通用解法解线性方程组。

得到b之后,带入到(14)里,就得到了每个点如何被周围2m+1个点表示,同时也得到了权重矩阵:

以下是不同平滑窗口大小和多项式次方的权重矩阵,用到系统中时只要选好参数就可以直接使用(m=3 n=1中第7行第一位是-5,图片中有误):

对于每一个新添加到平滑窗口里的姿态,使用前2m+1个姿态平滑,返回平滑后的数据,右移窗口(就是删第一个姿态,添加新姿态到最后)(第7行第一位是-5,图片中有误):

做了一些实验,对比分析实验结果后发现平滑窗口大小为7,多项式次数为1时,平滑效果最佳。大约平滑了20%:

平滑后的数据与原数据之间的误差是不可避免的,但还是有一些地方的误差是不必要的,比如一些本身平滑的轨迹,因为受到前后不平滑姿态的影响导致一定的不必要误差。遇到这种情况,我们便减少平滑后数据与原始数据之间的距离。比如连续k个姿态,波动角度小于一定值,我们便做这种处理:

经过一定的实验,我们发现连续5个姿态波动cos大于0.8(角度小于arccos(0.8))时减少距离,效果最好:

最终整个平滑过程减少了姿态轨迹的波动,提高了约20%的平滑度,误差约0.01*50=5像素(图中一个unit为50pixel),耗时0.1毫秒。

这篇关于相机姿态轨迹最小二乘多项式平滑优化(防抖动)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/366298

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri

poj 2175 最小费用最大流TLE

题意: 一条街上有n个大楼,坐标为xi,yi,bi个人在里面工作。 然后防空洞的坐标为pj,qj,可以容纳cj个人。 从大楼i中的人到防空洞j去避难所需的时间为 abs(xi - pi) + (yi - qi) + 1。 现在设计了一个避难计划,指定从大楼i到防空洞j避难的人数 eij。 判断如果按照原计划进行,所有人避难所用的时间总和是不是最小的。 若是,输出“OPETIMAL",若