OpenCV(JavaCV)与OpenCV(C/C++接口)的比较[英] OpenCV (JavaCV) vs OpenCV (C/C++ interfaces)

本文是小编为大家收集整理的关于OpenCV(JavaCV)与OpenCV(C/C++接口)的比较的处理方法,想解了OpenCV(JavaCV)与OpenCV(C/C++接口)的比较的问题怎么解决?OpenCV(JavaCV)与OpenCV(C/C++接口)的比较问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

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

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

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

谢谢

推荐答案

我想在@ejbs 的回答中添加几件事.

首先,你关心两个不同的问题:

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

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

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

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

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

因此,一般来说,无论您使用的是 OpenCV 还是 JavaCV,都将获得几乎相同的性能.它更多地取决于您的主要任务 - 是 Java 还是 C++ 更适合您的需求.

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

本文地址:https://www.itbaoku.cn/post/359172.html