OpenCV在Java与C++中的实时性能
Real-time performance of OpenCV in Java vs. C++
我意识到这里有很多类似的问题,但我相信我的情况足够独特,有理由发表自己的文章。
我正在研究一种"视觉指挥"——我已经建立了一个程序,可以跟踪一个人的手势,并从这些手势中推断出节奏(以每分钟节拍为单位)。我现在想做的是将测量的节奏映射到一个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,但可能值得检查。
- 从数据库实时显示QT c++中的数据
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- 有没有办法使用 c++ 实时阅读文本?
- 在本地网络中通过OpenCV(C++)实时流式传输图像
- 将相机数据从服务器实时流式传输到客户端
- 将实时(非静态)放在qt(c ++)上
- 线程之间的实时数据共享
- 如何在实时应用程序中锁定线程
- OpenCV - 来自相机的实时馈送不流畅
- 如何提高 OpenCV 实时检测器应用程序的帧率?
- 使用 Opencv 将姿势值实时写入文本文件
- Firebase C++ Windows 上的实时数据库连接丢失
- 我在 IDA 或 dbg 或 olly 上看到的内存是否与我在 RAM 上实时加载的内存相同?
- 媒体基金会:WavSink以比实时消耗率更快的速度处理音频-是否可以实时限制后台处理
- 如何实时捕获相机的视频?
- ROOT中的实时更新
- C# 的垃圾回收会给实时音频应用程序带来问题吗?
- 如何编写日志文件,以便可以使用记事本实时读取它以进行C++
- QChart实时性能
- 标准C++11是否保证high_resolution_clock测量实时性(非CPU周期)