OpenCV(JavaCV)与OpenCV(C / C ++接口)

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (342)

我只是想知道在使用JavaCV而不是OpenCV的C / C ++实现时,在给定的一组机器上是否会有相对显着的速度性能优势。

如果我错了,请纠正我的错误,但我的理解是,opencv的c / c ++实现更接近机器,因为OpenCV的Java实现(JavaC)会有速度性能劣势(以毫秒为单位)一个虚拟机将您的源代码转换为字节码,然后转换为机器码。而使用c / c ++,它会直接转换为机器代码,因此不会承载虚拟机开销的中间步骤。

如果我犯了错误,请不要在这里杀死我; 我只是在学习,并会欢迎建设性的批评。

提问于
用户回答回答于

我想给@ ejbs的答案添加几件事情。

首先,你关心两个不同的问题:

  1. Java与C ++性能
  2. OpenCV vs JavaCV

Java与C ++的表现是一个漫长而长久的故事。一方面,C ++程序被编译为高度优化的本地代码。它们始终快速启动,并且始终快速运行,而不会暂停垃圾回收或其他VM职责(如Java一样)。另一方面,一旦编译完成,无论在运行什么机器上,C ++程序都不能改变,而Java字节码是“ 及时 ” 编译的,并且始终针对处理器体系结构进行了优化他们跑了。在现代世界中,有这么多不同的设备(和处理器架构),这可能非常重要。而且,一些JVM(例如Oracle Hotspot)甚至可以优化已经编译为本地代码的代码!虚拟机收集有关程序执行的数据,并不时尝试重写代码,使其针对特定执行进行优化。所以在这样复杂的环境中,比较不同编程语言中实现性能的唯一真正方法就是运行它们并查看结果。

OpenCV与JavaCV是另一回事。首先,您需要了解这些库背后的技术堆栈。

OpenCV最初是在1999年在英特尔研究实验室中创建的,并且是用C语言编写的。从那时起,它多次更换了维护者,成为了开源软件并达到了第三版(即将发布)。目前,该库的核心是用C ++编写的,使用Python中的流行界面以及其他编程语言中的许多包装。

JavaCV就是这种包装器之一。因此,在大多数情况下,当您使用JavaCV运行程序时,您实际上也使用OpenCV,只需通过另一个界面调用它即可。但JavaCV提供的不仅仅是OpenCV的一对一包装。实际上,它捆绑了所有图像处理库,包括FFmpeg,OpenKinect等。(请注意,在C ++中,您也可以绑定这些库)。

所以,一般来说,使用OpenCV或JavaCV并不重要,你将获得几乎相同的性能。它更依赖于你的主要任务 - 是Java还是C ++,它更适合你的需求。

关于表现还有一点更重要。使用OpenCV(直接或通过包装器),您有时会发现OpenCV函数通过几个命令来克服其他实现。这是因为其核心中大量使用低级优化。例如,OpenCV的filter2D函数是SIMD 加速的,因此可以并行处理多组数据。而当涉及到计算机视觉时,常见功能的这种优化很容易导致显着的加速。

用户回答回答于

JavaCV与OpenCV的接口,所以当你调用OpenCV相关的东西时会有一些开销,但总的来说大多数繁重的工作仍然在C ++端,因此不会有非常大的性能损失。

你将不得不做性能基准来找出更多。

PS。我在这里很新,但我确定这不是适合StackOverflow的问题。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励