OpenCV在爪哇与C++的实时性能
我意识到这里有很多类似的问题,但我相信我的情况是独一无二的,足以证明自己的帖子
我正在研究一种“视觉指挥”——我建立了一个程序,可以跟踪一个人的手势,并根据这些手势推断出节奏(以每分钟的节拍为单位)。我现在想做的是将测量的节奏映射到一个MIDI文件,该文件在人指挥时播放。基本上,我希望这个程序允许某人指挥一段合成的曲子,其中演奏的文件的节奏受指挥的实时手势的影响。我用OpenCV库在C++中编写了这个文件。p>
这就是事情变得有趣的地方。直接修改MIDI文件的节奏看起来是一项艰巨的任务,考虑到今年夏天剩下的时间有限,我决定去别处看看。我碰巧在JavaAPI中找到Sequencer接口,它有一个可爱的方法setTempoinBPM
。它正是我所需要的;我在C++代码中工作有问题。
<>我尝试创建自己的JVM,用于调用C++代码中的java方法,但没有用。我还尝试过通过向system()
传递适当的命令行参数来调用Java程序,但在开始使用这种方法播放后,我无法改变MIDI文件的节奏
<强>我想知道您的观点:OpenCV在java上的性能是否足够与C++的性能相媲美,将我的项目转换成java是值得的? (如果您碰巧知道如何轻松地改变正在播放的MIDI曲目的节奏,请随时分享。)
# 1 楼答案
它在幕后使用rtMidi
快速搜索,看起来可能有可能从C++直接控制tempo(参见^ {< CD1>}方法)。我不确定是否有一个干净的API,因为我没有太多使用rtMidi,但可能值得检查
# 2 楼答案
也许您可以遵循解析/编译方法,而不是映射到MIDI文件
将MIDI视为数据的表示形式(序列化的数据)。将数据解析为一个中间表示(IR),它对你的特定问题(即调整节奏)有意义。试想,“我怎样才能最好地构造内存中的数据,这样就很容易操纵节奏?”
然后,使用包like this,您可以解析midi文件并提取重要部分。该软件包可能已经有了适合您的问题的IR。显然,它有一个序列化方法,可能需要将文件输入回播放器。或者,你可以找到一个球员,你可以把你的IR直接传递给他。如果你选择了一个已经用于一个已知玩家的IR(并且仍然适合你的节奏操控),那么你就不必考虑在修改了你的IR之后序列化它。p>
希望这能帮助