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

Posted

技术标签:

【中文标题】Java 与 C++ 中 OpenCV 的实时性能【英文标题】:Real-time performance of OpenCV in Java vs. C++ 【发布时间】:2013-07-29 18:20:02 【问题描述】:

我知道这里有许多类似的问题,但我相信我的情况非常独特,足以保证自己发帖。

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

这就是事情变得有趣/令人毛骨悚然的地方。直接修改 MIDI 文件的速度看起来是一项艰巨的任务,鉴于今年夏天剩下的时间有限,我决定去别处看看。我碰巧在 Java API 中找到了 Sequencer 接口,它有一个可爱的方法,叫做setTempoinBPM。它完全符合我的需要;我只是无法让它在我的 C++ 代码中工作。

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

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

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

【问题讨论】:

一篇文章中有这么多问题。我真的不知道为什么你会如此轻易地重写你已经拥有的一切。我不知道用于 c++ 的好的免费 MIDI API,但我玩过Java Invocation API,它真的没有那么具有挑战性。如果你没有找到好的 C++ 库,你应该调查一下。 抱歉,如果不清楚 - 您发布的链接正是我试图创建自己的 JVM 时所做的,但由于某种原因,我无法让它工作。 (我可能忽略了一些非常简单的事情,但仍然如此。)我很感谢您的回复! @Connor 听起来是个很酷的项目! @Connor 我明白你的意思,我真的很困惑,调试你的 JVM 启动出现问题在你的“可能的解决方案”列表中低于“重写我的整个项目”。 【参考方案1】:

除了映射到 MIDI 文件,也许您可​​以按照解析/编译方法。

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

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

希望对您有所帮助...

【讨论】:

感谢您的建议 - 我一直在寻找其他几个类似的库。希望我可以让它与一些不那么低级的东西一起工作,但如果不存在高级解决方案,最好有一些选择。我很感激!【参考方案2】:

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

它在幕后使用rtMidi。

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

【讨论】:

感谢您的回复!我正在查看一些类似的库,但有其他选择总是好的。

以上是关于Java 与 C++ 中 OpenCV 的实时性能的主要内容,如果未能解决你的问题,请参考以下文章

实时模板匹配 - OpenCV、C++

C++ 本机 Vs C++/Cli 性能(用于 OpenCV 项目)

实时手势识别(C++与python都可实现)

OpenCV 的 Python 或 C++ 编码之间的性能是不是不同?

在实时视频中仅更改 Mat 的一部分 OpenCV Native C++ Android Studio

C ++中的线性搜索与二进制搜索实时性能