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

OpenCV(JavaCV)与OpenCV(C/C+;+;接口),java,c++,c,opencv,javacv,Java,C++,C,Opencv,Javacv,我只是想知道当使用JavaCV而不是OpenCV的C/C++实现时,在给定的一组机器上是否会有显著的速度性能优势 如果我错了,请纠正我,但我的理解是,opencv的c/c++实现更接近于机器,而作为opencv的Java实现,JavaC在速度性能方面会有一些缺点(以毫秒为单位)因为会有一个虚拟机将您的源代码转换为字节码,然后再转换为机器代码。然而,使用c/c++时,它会直接转换为机器代码,因此不会承担虚拟机开销的中间步骤 如果我犯了错误,请不要在这里杀了我;我只是在学习,欢迎建设性的批评 谢谢

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

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

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


谢谢

javav接口到OpenCV,所以当你调用OpenCV相关的东西时,会有一些开销,但是一般来说,大部分繁重的工作仍然在C++侧,因此不会有很大的性能损失。 您必须进行性能基准测试才能了解更多信息


顺便说一句,我对这里很陌生,但我很确定这不是一个适合StackOverflow的问题。

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

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

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

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

    OpenCV最初于1999年在英特尔研究实验室创建,并用C语言编写。从那时起,它多次更换了维护人员,成为开源软件,并达到了第三版(即将发布)。目前,该库的核心是用C++编写的,Python中有流行的接口,还有其他编程语言中的一些包装。p> JavaCV就是这样的包装器之一。所以,在大多数情况下,当您使用JavaCV运行程序时,实际上也使用OpenCV,只需通过另一个接口调用它即可。但是JavaCV提供的不仅仅是OpenCV的一对一包装。事实上,它捆绑了大量的图像处理库,包括FFmpeg、OpenKinect等。(注意,在C++中,你也可以绑定这些库)。 所以,一般来说,无论您使用的是OpenCV还是JavaCV,您都将获得大致相同的性能。它更依赖于你的主要任务——是java还是C++,它更适合你的需要。p>
    关于性能,还有一点很重要。使用OpenCV(直接或通过包装器),您有时会发现OpenCV函数比其他实现高出几个数量级。这是因为在其核心中大量使用了低级优化。例如,OpenCV的函数是加速的,因此可以并行处理多组数据。当涉及到计算机视觉时,这种对常用功能的优化很容易导致显著的加速

    > P>我想再添加一些关于java作为C++库的接口……/P>的见解。 A) 发展:

    1) 虽然java可能更容易管理大型项目,并且编译速度非常快,但从java调试本机代码非常困难,几乎不可能

    当本机端的代码崩溃…或内存泄漏(经常发生的事情…)时,您会感到有点无助

    2) 除非您自己构建绑定(即使使用swig或其他方法,这也不是一项容易的任务……),否则您将依赖绑定生成器的良好意愿/健康状况/时间。。。。 所以在这种情况下,我更喜欢官方的“桌面java”绑定而不是javacv

    B) 表演

    1) 虽然绑定可以优化(使用neobuffer进行内存传输),就像javacv一样,但每个本机函数调用的jni开销仍然非常小- 在我们的例子中,这是没有意义的,因为与此jni开销相比,大多数opencv函数消耗X100000++cpu周期

    2) 大问题——停止世界垃圾收集器(GC)

    java使用垃圾收集器停止所有cpu线程,使其不适合实时应用程序。听说过一些变通方法,如重新设计应用程序以避免产生垃圾、使用spaciel gc或使用实时java(成本-金钱…),它们似乎都是额外的工作(而您所需要的只是一条通往opencv的简单路径)

    结论-如果你想创建一个专业的实时应用程序,那么就用C++来 除非你有一个巨大的模块化项目来管理——只要坚持C++和预编译头(使事情编译得更快……)


    虽然使用java是一种乐趣,但当涉及到本机绑定时,它的麻烦就大了……我知道我曾经有过……

    但是java是平台独立的,因为C/C++依赖于平台。而且让opencv库与maven一起工作的问题更少:为什么你认为它不适合这样做?我不是