source org bytedeco java c++ c opencv javacv

org - OpenCV(JavaCV) vs OpenCV(interfaces C/C++)



opencv source (3)

Me pregunto si habría una ventaja significativa en el rendimiento de la velocidad relativamente en un conjunto dado de máquinas cuando se utiliza JavaCV en lugar de la implementación C / C ++ de OpenCV.

Corríjame si me equivoco, pero entiendo que la implementación c / c ++ de opencv está más cerca de la máquina en la que, como la implementación Java de OpenCV, JavaC, tendría una ligera desventaja en el rendimiento de la velocidad (en milisegundos) que habría una máquina virtual que convierte su código fuente en un código de bytes que luego se convierte en código de máquina. Considerando que, con c / c ++, se convierte directamente al código de la máquina y por lo tanto no lleva ese paso intermedio de la sobrecarga de la máquina virtual.

Por favor, no me mates aquí si cometí errores; Solo estoy aprendiendo y me gustaría recibir críticas constructivas.

Gracias


Las interfaces JavaCV para OpenCV, por lo que cuando se llama algo relacionado con OpenCV, habrá algunos gastos generales, pero en general, la mayor parte del trabajo pesado seguirá en el lado C ++ y, por lo tanto, no habrá una penalización de rendimiento muy grande.

Tendría que hacer pruebas de rendimiento para obtener más información.

PD. Soy bastante nuevo aquí, pero estoy bastante seguro de que esta no es una pregunta adecuada para .


Me gustaría agregar algunos puntos de vista más sobre java como una interfaz para las bibliotecas de c ++ ...

A) desarrollando:

1) aunque Java puede ser más fácil de administrar proyectos a gran escala y compila extremadamente rápido, es muy difícil, y casi imposible de depurar código nativo de Java ...

cuando el código se aplasta en el lado nativo ... o las fugas de memoria (algo que sucede mucho ...) te sientes impotente ...

2) a menos que construya los enlaces usted mismo (no es una tarea fácil, incluso con el uso de swig o lo que sea ...) depende de la buena voluntad / salud / tiempo del creador de enlaces ... así que en este caso preferiría Enlaces oficiales de "desktop java" sobre javacv ...

B) Rendimiento.

1) mientras que los enlaces pueden optimizarse (transferencia de memoria usando neobuffer) como en el caso javacv, todavía hay una sobrecarga jni muy pequeña para cada función nativa, esto no tiene sentido en nuestro caso, ya que la mayoría de las funciones opencv consumen ciclos de CPU de X100000 ++ en comparación con este jni arriba ...

2) El GRAN PROBLEMA ---- detener el coleccionista de basuras del mundo (GC)

java usa un recolector de basura que detiene todos los hilos de los cpu, lo que lo hace INNOVABLE para las aplicaciones de TIEMPO REAL, se ha oído hablar de cómo se ha rediseñado tu aplicación para no producir basura, usa un espacio de Gc o usa Java en tiempo real ...) todos parecen ser trabajo extra (y todo lo que querías es un camino fácil de abrir ...)

conclusión: si desea crear una aplicación profesional en tiempo real, vaya con c ++ a menos que tenga que gestionar un gran proyecto modular, simplemente siga con c ++ y los encabezados precompilados (haga que las cosas se compilen más rápido ...) mientras que Java es un placer trabajar con, cuando se trata de la unión nativa, el HELL se desata ... sé que he estado allí ...


Me gustaría agregar un par de cosas a la respuesta de @ ejbs.

En primer lugar, te preocupan 2 temas separados:

  1. Rendimiento de Java vs. C ++
  2. OpenCV vs JavaCV

El rendimiento de Java vs. C ++ es una historia larga y larga. Por un lado, los programas de C ++ se compilan a un código nativo altamente optimizado . Se inician rápidamente y se ejecutan rápidamente todo el tiempo sin detenerse para la recolección de basura u otras tareas de VM (como lo hace Java). Por otro lado, una vez compilado, el programa en C ++ no puede cambiar, sin importar en qué máquina se ejecute, mientras que el código de bytes de Java se compila " justo a tiempo " y siempre está optimizado para la arquitectura de procesador en la que se ejecuta. En el mundo moderno, con tantos dispositivos diferentes (y arquitecturas de procesador) esto puede ser realmente significativo. Además, algunas JVM (por ejemplo, Oracle Hotspot) pueden optimizar incluso el código que ya está compilado en código nativo. Las máquinas virtuales recopilan datos sobre la ejecución del programa y, de vez en cuando, intentan reescribir el código de forma tal que esté optimizado para esta ejecución específica . Por lo tanto, en circunstancias tan complicadas, la única forma real de comparar el rendimiento de las implementaciones en diferentes lenguajes de programación es simplemente ejecutarlas y ver el resultado.

OpenCV vs. JavaCV es otra historia. Primero necesitas entender la pila de tecnologías detrás de estas bibliotecas.

OpenCV se creó originalmente en 1999 en los laboratorios de investigación de Intel y se escribió en C. Desde ese momento, cambió al mantenedor varias veces, se convirtió en código abierto y llegó a la 3ª versión (próxima versión). En este momento, el núcleo de la biblioteca está escrito en C ++ con una interfaz popular en Python y una cantidad de envoltorios en otros lenguajes de programación.

JavaCV es uno de esos envoltorios. Entonces, en la mayoría de los casos cuando ejecutas un programa con JavaCV, también usas OpenCV, simplemente llámalo a través de otra interfaz. Pero JavaCV proporciona más que solo una envoltura personalizada alrededor de OpenCV. De hecho, agrupa la cantidad total de bibliotecas de procesamiento de imágenes, incluidas FFmpeg, OpenKinect y otras. (Tenga en cuenta que en C ++ también puede enlazar estas bibliotecas).

Por lo tanto, en general, no importa lo que esté utilizando: OpenCV o JavaCV, obtendrá casi el mismo rendimiento. Depende más de su tarea principal, es Java o C ++, que se adapta mejor a sus necesidades.

Hay un punto más importante sobre el rendimiento. Usando OpenCV (directamente o por medio de un envoltorio) a veces encontrará que las funciones de OpenCV superan otras implementaciones por varias órdenes. Esto se debe al uso intensivo de optimizaciones de bajo nivel en su núcleo. Por ejemplo, la función filter2D de OpenCV está filter2D filter2D y, por lo tanto, puede procesar varios conjuntos de datos en paralelo. Y cuando se trata de la visión por computadora, tales optimizaciones de funciones comunes pueden fácilmente conducir a una importante aceleración.