SG-filter

Savitzky-Golay filtering(最小二乘平滑滤波)

用途

平滑视频中检测的人体关键点

语法描述

y = sgolayfilt(x,order,framelen):对数据向量x使用Savitzky-Golay FIR平滑滤波器。如果x是一个矩阵,则sgolayfilt对每一列进行操作。多项式阶次order必须小于框长度framelen,因此framelen必须是奇数。如果order=framelen-1,则滤波器不进行平滑。

y = sgolayfilt(x,order,framelen,weights):指定了一个权重向量weights,它为正实数,用于最小二乘估计的最小化。如果该值没有指定,或定义为空[],它默认为单位矩阵。

y = sgolayfilt(x,order,framelen,weights,dim):指定了维数dim。如果dim没有被指定,则sgolayfilt对第一个不为1的维进行操作;指定为1则对列向量进行操作,指定2则对行向量进行操作。

用法

kpt_queue = []
from scipy.signal import savgol_filter
def smooth_filter(kpts):
    if len(kpt_queue) < 6:
        kpt_queue.append(kpts)
        return kpts

    queue_length = len(kpt_queue)
    if queue_length == 20:
        kpt_queue.pop(0)
    kpt_queue.append(kpts)

    # transpose to shape (17, 2, num, 50) 关节点、横纵坐标、每帧人数、帧数
    transKpts = np.array(kpt_queue).transpose(1,2,3,0)

    window_length = queue_length - 1 if queue_length % 2 == 0 else queue_length - 2
    # array, window_length越大越好, polyorder
    result = savgol_filter(transKpts, window_length, 3).transpose(3, 0, 1, 2) #shape(frame_num, human_num, 17, 2)

    # return the 2rd last frame
    return result[-2]

你可能感兴趣的:(滤波器)