【问题标题】:Smoothing 2D points (scattered) in real-time (online smoothing)实时平滑 2D 点(分散)(在线平滑)
【发布时间】:2021-09-30 10:30:28
【问题描述】:
我必须处理使用手关键点作为指针(或非接触式鼠标)的任务。
这里的主要问题是(深度学习)手部关键点并不完美(有时在不同的光线、肤色下),因此选择的关键点是分散的,不像我们使用的真实鼠标那样平滑移动。
如何在线(实时)平滑它们。不是给定二维点数组的解决方案,然后我们在这个数组上进行平滑处理。这是新点一一进入的情况,我们必须立即纠正!避免用户遭受鼠标的散射。
我正在使用 opencv 和 python。请善待,因为我是计算机视觉的新手。
谢谢
【问题讨论】:
标签:
python
opencv
computer-vision
object-detection
【解决方案1】:
最简单的方法是使用移动平均线。您可以非常高效地计算最后n 步的平均位置,并使用它来“平滑”轨迹:
n = 5 # the average "window size"
counter = 0 # count how many steps so far
avg = 0. # the average
while True:
# every time step
val = get_keypoint_value_for_this_time_step()
counter += 1
coeff = 1. / min(counter, n)
# update using moving average
avg = coeff * val + (1. - coeff) * avg
print(f'Current time step={val} smothed={avg}')
移动平均线的更多变体可以在here找到。
【解决方案2】:
由于您想要类似物理的行为,您可以使用简单的物理模型。请注意,下面的所有数组都描述了当前动态状态的属性,因此具有相同的形状 (1, 2)。
-
定义力量
a: 吸引力 = (k - p) * 缩放器
-
速度
v:速度 = v + a
-
职位
p:当前位置 = p + v
k:new dl key point = 无论你的 dl 输出什么
你输出 p 给用户。请注意,如果您想要更自然的运动,您可以使用缩放器或向 v 添加额外的力(如 a)。
此外,要获得所有点,请将 p 连接到 ps 其中 ps.shape = (n, 2)。