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

Real-time performance of OpenCV in Java vs. C++

本文关键字:实时 实时性 性能 C++ Java OpenCV      更新时间:2023-10-16

我意识到这里有很多类似的问题,但我相信我的情况足够独特,有理由发表自己的文章。

我正在研究一种"视觉指挥"——我已经建立了一个程序,可以跟踪一个人的手势,并从这些手势中推断出节奏(以每分钟节拍为单位)。我现在想做的是将测量的节奏映射到一个MIDI文件中,该文件在演奏时播放。基本上,我希望这个程序能让某人指挥一首合成的曲子,其中演奏的文件的节奏会实时受到指挥手势的影响。我使用OpenCV库在C++中编写了这篇文章。

这就是事情变得有趣/棘手的地方。直接修改MIDI文件的节奏看起来是一项艰巨的任务,考虑到今年夏天剩下的时间有限,我决定另谋高就。我偶然在Java API中找到了Sequencer接口,它有一个名为setTempoinBPM的可爱方法。它正是我所需要的;我只是在让它在我的C++代码中工作时遇到了问题。

我曾尝试创建自己的JVM来调用C++代码中的Java方法,但没有成功。我还尝试过通过向system()传递适当的命令行参数来调用Java程序,但在使用这种方法开始播放后,我无法更改MIDI文件的节奏。

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

我想听听你的意见:OpenCV在Java上的性能是否足以与它的C++性能相媲美,将我的项目转换为Java是值得的?(如果你碰巧知道如何轻松地改变MIDI曲目的节奏,请随时分享。)

也许您可以采用解析/编译方法,而不是映射到MIDI文件。

将MIDI视为数据的表示(序列化的表示)。将数据解析为对您的特定问题有意义的中间表示(IR)(即调整节奏)。只要想一想,"我如何才能最好地构建内存中的数据,使其易于操纵节奏?"

然后,使用这样的包,您可以解析midi文件并提取重要部分。该程序包可能已经有一个适合您问题的IR。它看起来确实有一个序列化方法,可能需要该方法才能将文件输入回播放器。或者,你可以找到一个可以直接将IR传递给的玩家。如果你选择了一个已经用于已知玩家的IR(并且仍然适合你的节奏操纵),那么你就不必在修改后考虑序列化你的IR。

希望能有所帮助。。。

我对c++不是很有经验,但通过openFrameworks和ofxMidi使用过一些midi。

在幕后,它使用rtMidi。

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