OpenCV(JavaCV)与OpenCV(C/C+;+;接口)
我只是想知道当使用JavaCV而不是OpenCV的C/C++实现时,在给定的一组机器上是否会有显著的速度性能优势 如果我错了,请纠正我,但我的理解是,opencv的c/c++实现更接近于机器,而作为opencv的Java实现,JavaC在速度性能方面会有一些缺点(以毫秒为单位)因为会有一个虚拟机将您的源代码转换为字节码,然后再转换为机器代码。然而,使用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++时,它会直接转换为机器代码,因此不会承担虚拟机开销的中间步骤 如果我犯了错误,请不要在这里杀了我;我只是在学习,欢迎建设性的批评 谢谢
谢谢 javav接口到OpenCV,所以当你调用OpenCV相关的东西时,会有一些开销,但是一般来说,大部分繁重的工作仍然在C++侧,因此不会有很大的性能损失。 您必须进行性能基准测试才能了解更多信息
顺便说一句,我对这里很陌生,但我很确定这不是一个适合StackOverflow的问题。我想在@ejbs的答案中添加一些东西 首先,您关注两个不同的问题:
关于性能,还有一点很重要。使用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一起工作的问题更少:为什么你认为它不适合这样做?我不是