OpenCV (JavaCV) vs OpenCV (C/C++ interfaces)

2022-09-01 18:02:19

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

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

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

谢谢


答案 1

我想在@ejbs的答案中添加一些东西。

首先,您关注2个单独的问题:

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

Java与C++性能是一个很长很长的故事。一方面,C++程序被编译为高度优化的本机代码。它们启动速度快,运行速度快,无需暂停垃圾回收或其他 VM 任务(如 Java 所做的那样)。另一方面,一旦编译,C++中的程序就无法更改,无论它们在哪台机器上运行,而Java字节码是“及时”编译,并且始终针对它们运行的处理器架构进行优化。在现代世界中,有这么多不同的设备(和处理器架构),这可能非常重要。此外,一些JVM(例如Oracle Hotspot)甚至可以优化已经编译为本机代码的代码!VM 收集有关程序执行的数据,并会不时尝试重写代码,以便针对此特定执行进行优化。因此,在这种复杂的情况下,比较不同编程语言中实现性能的唯一真正方法是运行它们并查看结果。

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

OpenCV最初于1999年在英特尔研究实验室创建,是用C语言编写的。从那时起,它多次更改维护者,成为开源并达到第3个版本(即将发布)。目前,该库的核心是用C++Python中的流行接口和其他编程语言中的许多包装器编写的。

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

所以,一般来说,无论你使用什么 - OpenCV或JavaCV,你都会得到几乎相同的性能。它更多地取决于您的主要任务 - 是Java还是C++哪个更适合您的需求。

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


答案 2

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

您必须进行性能基准测试才能了解更多信息。

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


推荐