我想在@ejbs的答案中添加一些东西。
首先,您关注2个单独的问题:
- Java 与 C++ 性能
- 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加速的,因此可以并行处理多组数据。当涉及到计算机视觉时,这种常见功能的优化很容易导致显着的加速。