gpt4 book ai didi

c# - 从 Kinect 传感器数据计算 BPM

转载 作者:太空狗 更新时间:2023-10-29 17:58:28 24 4
gpt4 key购买 nike

我正在努力使用 Kinect for Windows SDK 创建一个用于执行的应用程序(使用 C#)。

基本上,我需要跟踪指挥的一只手(通常是右手)并识别他的指挥速度 (BPM),以通过 MIDI 将此值发送到另一个应用程序。

我从 SkeletonFramesReadyEvent 添加带有 DateTime.Now.Ticks 时间戳的 JointType.HandRight 到历史 List 更新并删除第一个条目。我保留了 60 帧(2 秒)的历史记录。

我通过搜索 Joint.Position.Y 的最后一个低点和高点来计算 BPM,然后计算差值并除以 bpm = 60*ticksPerSecond/diff .然而结果是错误的。还有另一种方法吗?我错过了什么?

这是我目前使用的:

public int DetectBPM(JointType type)
{
// we have not history yet
if (!HasHistory()) return 0;

// only calculate every second
var detectTime = DateTime.Now.Second;
if (_lastBPM != 0 && _lastBPMDectect == detectTime) return _lastBPM;

// search last high/low boundaries
var index = (int) type;
var list = History[index];
var i = list.Count - 1;

var lastHigh = list[i];
var lastLow = list[i];

// shift to last peak first
while (i > 0 && list[i].Joint.Position.Y >= list[i - 1].Joint.Position.Y) i--;

// find last low
while (i >= 0 && lastLow.Joint.Position.Y >= list[i].Joint.Position.Y) lastLow = list[i--];

// find last high
while (i >= 0 && lastHigh.Joint.Position.Y <= list[i].Joint.Position.Y) lastHigh = list[i--];

var ticks = lastLow.Timestamp - lastHigh.Timestamp;
var elapsedTime = new TimeSpan(ticks);

var bpm = (int) (60000/elapsedTime.TotalMilliseconds);

Console.WriteLine("DEBUG: BPM = " + _lastBPM + ", elapsedMS: " + elapsedTime.TotalMilliseconds);

_lastBPMDectect = detectTime;
_lastBPM = bpm;

return _lastBPM;
}

最佳答案

我知道怎么做了。我遗漏了一点并计算了手的峰值和低位之间的 BPM,这是错误的。我必须计算最后两个低点之间的时间差才能得到正确的结果。

正确的做法是,找到最后一个峰的起始点。从那里移动到最后一个低点,这是计算差异的第一个点。移动到下一个峰值并再次下降到下一个低点,这是计算差异的第二个点。

原理如下图所示

BPM calucaltion schema

这会导致 BPM 计算得很好,如下所示:

var ticks = Math.Abs(firstLow.Ticks - secondLow.Ticks);
var elapsedTime = new TimeSpan(ticks);

var bpm = (int) (60000/elapsedTime.TotalMilliseconds);

感谢您的参与。

关于c# - 从 Kinect 传感器数据计算 BPM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11265276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com