Python Time/Position 列表中的低通滤波器
Python low-pass filter on list of Time/Position
让我先解释一下我的目标和我的问题。
我有一个 物体在一个 bocal(准确地说是一只老鼠)内绕圈 移动,我需要知道它在一分钟内旋转了多少圈。运动不是一个完美的圆圈,可以是 混乱的。它可以停止几秒钟,然后重新开始移动。
但我所知道的是,我每分钟旋转 3 到 20 次 => 低频(在 0.05 赫兹和 0.33 赫兹之间).
我正在用 30 fps 的相机拍摄这个物体 30 分钟。
使用 Python 和 OpenCV,我设法提取 (X,Y) 坐标。由于 30 fps 对于我正在寻找的频率来说有点高,我选择了 15 上的一帧,以便 采样频率为 2 Hz。
第一个问题是,有时我漏掉了一点,因为 OpenCV 找不到对象。这是我无法解决的问题,因为我使用 HSV 颜色蒙版跟踪的点有时会被隐藏。
其实我要过滤的数据是:
- 帧,帧数列表。在索引 [i] 处,我有对应于 X[i] 和 Y[i]
的帧号
- X,X坐标的列表
- Y,Y坐标的列表
例如,我有这样的列表:
- 帧数 = [15, 90, 165, 180, 195, 210, 225, 300, 315, 375 ,405]
- X = [395, 487, 389, 389, 358, 382, 373, 389, 397, 403, 446]
- Y = [167, 211, 166, 173, 180, 185, 191, 223, 241, 231, 238]
This is the king of movement I get, as you can see, I need to filter the high frequency.
现在我的问题:即使我有一些过滤和编码方面的基础知识,我也不知道该怎么做,也不知道该使用哪个库。
我读到 scipy 应该具有所有必需的功能,但我不知道该使用哪一个以及如何使用。
我不确定,但我认为我应该这样做:
- 傅里叶
转型
- 低通滤波
- 逆变换
能否请您告诉我我是否正确,并为我指明编码部分的正确方向?
感谢您的帮助,
马修
在深入研究傅里叶变换之前,您可以只应用一阶或二阶低通滤波器。您可以先对数据进行线性插值,这样您就可以获得恒定的 2Hz
频率。然后您可以对数据点应用一阶低通滤波器。
y_k = a * x_k + (1-a) * y_km1, a in [0,1]
x_k 是您的观察结果,y_k 是您的过滤估计值。
然后,如果第一个原型产生了一些有用的结果,您也许可以使用一些物理模型来获得更好的估算器。卡尔曼滤波器可以更好地利用您的潜在物理现实。但是为此,您首先需要了解如何模拟物理现实。
https://en.wikipedia.org/wiki/Kalman_filter
在这里你也许还可以找到一个更接近计算机视觉跟踪运动的例子:
http://www.diss.fu-berlin.de/docs/servlets/MCRFileNodeServlet/FUDOCS_derivate_000000000473/2005_12.pdf
让我先解释一下我的目标和我的问题。 我有一个 物体在一个 bocal(准确地说是一只老鼠)内绕圈 移动,我需要知道它在一分钟内旋转了多少圈。运动不是一个完美的圆圈,可以是 混乱的。它可以停止几秒钟,然后重新开始移动。
但我所知道的是,我每分钟旋转 3 到 20 次 => 低频(在 0.05 赫兹和 0.33 赫兹之间).
我正在用 30 fps 的相机拍摄这个物体 30 分钟。 使用 Python 和 OpenCV,我设法提取 (X,Y) 坐标。由于 30 fps 对于我正在寻找的频率来说有点高,我选择了 15 上的一帧,以便 采样频率为 2 Hz。
第一个问题是,有时我漏掉了一点,因为 OpenCV 找不到对象。这是我无法解决的问题,因为我使用 HSV 颜色蒙版跟踪的点有时会被隐藏。
其实我要过滤的数据是:
- 帧,帧数列表。在索引 [i] 处,我有对应于 X[i] 和 Y[i] 的帧号
- X,X坐标的列表
- Y,Y坐标的列表
例如,我有这样的列表:
- 帧数 = [15, 90, 165, 180, 195, 210, 225, 300, 315, 375 ,405]
- X = [395, 487, 389, 389, 358, 382, 373, 389, 397, 403, 446]
- Y = [167, 211, 166, 173, 180, 185, 191, 223, 241, 231, 238]
This is the king of movement I get, as you can see, I need to filter the high frequency.
现在我的问题:即使我有一些过滤和编码方面的基础知识,我也不知道该怎么做,也不知道该使用哪个库。 我读到 scipy 应该具有所有必需的功能,但我不知道该使用哪一个以及如何使用。
我不确定,但我认为我应该这样做:
- 傅里叶 转型
- 低通滤波
- 逆变换
能否请您告诉我我是否正确,并为我指明编码部分的正确方向?
感谢您的帮助,
马修
在深入研究傅里叶变换之前,您可以只应用一阶或二阶低通滤波器。您可以先对数据进行线性插值,这样您就可以获得恒定的 2Hz
频率。然后您可以对数据点应用一阶低通滤波器。
y_k = a * x_k + (1-a) * y_km1, a in [0,1]
x_k 是您的观察结果,y_k 是您的过滤估计值。
然后,如果第一个原型产生了一些有用的结果,您也许可以使用一些物理模型来获得更好的估算器。卡尔曼滤波器可以更好地利用您的潜在物理现实。但是为此,您首先需要了解如何模拟物理现实。
https://en.wikipedia.org/wiki/Kalman_filter
在这里你也许还可以找到一个更接近计算机视觉跟踪运动的例子: http://www.diss.fu-berlin.de/docs/servlets/MCRFileNodeServlet/FUDOCS_derivate_000000000473/2005_12.pdf