OpenCV在Java与C ++中的实时性能

时间:2013-07-29 18:20:02

标签: java c++ opencv midi

我知道这里有很多类似的问题,但我相信我的情况足够独特,可以保证自己的职位。

我正在研究各种各样的“视觉导体” - 我已经建立了一个程序来跟踪一个人的手势并从这些手势中推断出节奏(以每分钟节拍为单位)。我现在要做的是将测量的速度映射到人员进行时播放的MIDI文件。基本上,我希望该程序允许某人进行合成片段,其中正在播放的文件的节奏受到指挥家实时手势的影响。我使用OpenCV库在C ++中编写了这个。

这里的事情变得有趣/多毛。直接修改MIDI文件的速度看起来像是一项艰巨的任务,鉴于我今年夏天剩下的时间有限,我决定去其他地方寻找。我碰巧在Java API中找到了Sequencer接口,它有一个名为setTempoinBPM的可爱方法。它完全符合我的需要;我一直无法在C ++代码中使用它。

我尝试创建自己的JVM来调用C ++代码中的Java方法,但无济于事。我也尝试通过将适当的命令行参数传递给system()来调用Java程序,但是在使用这种方法开始播放后我无法改变MIDI文件的速度。

我正在考虑将我的C ++代码转换为Java代码,以便直接调用setTempoinBPM(),但我一直听到有关这是否会影响OpenCV性能的相互矛盾的报告。

我想你的意见:OpenCV在Java上的表现是否与其C ++性能相当,将我的项目转换为Java值得付出努力? (如果您碰巧知道如何轻松改变播放MIDI音轨的速度,请随时分享。)

2 个答案:

答案 0 :(得分:0)

您可以按照解析/编译方法,而不是映射到MIDI文件。

将MIDI视为数据的表示(序列化的数据)。将数据解析为对您的特定问题有意义的中间表示(IR)(即调整速度)。试想一下,“我怎样才能最好地构建内存中的数据,以便轻松操控速度?”

然后,使用包like this,您可以解析midi文件并提取重要部分。该软件包可能已经有适合您问题的IR。它看起来肯定有一个序列化方法,可能需要将文件输回到播放器。或者,您可以找到一个能够直接将IR传递给的玩家。如果您选择已经用于已知播放器的IR(并且仍然适合您的速度操作),那么您在修改后不必考虑序列化IR。

希望有帮助...

答案 1 :(得分:0)

我对c ++不太熟悉,但在openFrameworksofxMidi使用了midi。

幕后使用rtMidi

快速搜索它似乎可以直接从c ++控制tempo(参见bottom of void RtMidiIn :: initialize方法)。不确定是否有一个很好的干净的API,因为我没有那么多使用rtMidi,但可能值得检查。