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

Pel*_*can 19 c c++ java opencv javacv

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

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

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

谢谢

ffr*_*end 64

我想在@ ejbs的回答中添加一些内容.

首先,您关注两个不同的问题:

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

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

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

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

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

所以,一般而言,无论你使用什么 - OpenCV或JavaCV,你都会获得相同的性能.它更依赖于您的主要任务 - Java或C++是否更适合您的需求.

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