ios objective-c gpuimage core-image

ios - Diferencias clave entre Core Image y GPUImage



objective-c core-image (2)

Como autor de GPUImage, es posible que desee tomar lo que digo con un grano de sal. Primero debo decir que tengo un tremendo respeto por el equipo de Core Image y por cómo continúan actualizando el marco. Era un usuario pesado de Core Image antes de escribir GPUImage, y modelaba muchos de sus elementos de diseño según cómo funcionaba Core Image en la Mac.

Ambos marcos están en constante evolución, por lo que una comparación realizada hoy podría no ser cierta en unos pocos meses. Puedo señalar las capacidades y los puntos de referencia actuales, pero no hay ninguna garantía de que no cambien cuando alguno de nosotros actualice las cosas.

Mi filosofía con GPUImage era crear una envoltura ligera alrededor de los cuadrantes de OpenGL (ES) renderizados con sombreadores, y hacerlo con una interfaz tan simple como sea posible. Como dije antes, saqué aspectos de Core Image que realmente me gustaban, pero también cambié partes de su interfaz que me habían disparado en el pasado. También extendí un poco las cosas, ya que Core Image solo se ocupa del procesamiento de imágenes, mientras que engancho la reproducción de películas, la entrada de cámara, la grabación de video y la captura de imágenes.

Cuando originalmente estaba dando vueltas a la idea de esto, Core Image aún no había llegado a iOS. Cuando lo lancé, Core Image se acababa de agregar a iOS. Sin embargo, la cantidad de filtros admitidos en iOS en ese momento era bastante limitada (sin distorsiones, por ejemplo), y Core Image en iOS no le permitía crear núcleos personalizados como lo hizo en Mac.

GPUImage proporcionó los medios para realizar operaciones personalizadas aceleradas por GPU en imágenes y video en iOS, donde Core Image no lo hizo. La mayoría de las personas que comenzaron a usarlo lo hicieron por esa razón, porque tenían algún efecto que no podían hacer con los filtros de imagen Core de stock.

Inicialmente, GPUImage también tenía ventajas significativas de rendimiento para muchas operaciones comunes . Sin embargo, el equipo de Core Image ha realizado mejoras significativas en la velocidad de procesamiento con cada versión de iOS y las cosas están muy cerca en este momento. Para algunas operaciones, GPUImage es más rápido y para otros, Core Image es más rápido. Parecen emplear algunas optimizaciones bastante inteligentes para cosas como borrones , que he comenzado a replicar en cosas como mi GPUImageiOSBlurFilter. También combinan las operaciones de múltiples etapas de manera inteligente, donde trato los pasos del filtro como elementos discretos y separados. En algunos casos en iOS, esto me da una ventaja, y he intentado reducir las consecuencias de la memoria recientemente, pero manejan muchos tipos de cadenas de filtros mejor que yo.

iOS 8 presenta la compatibilidad con el kernel personalizado en Core Image en iOS que siempre ha tenido en la Mac. Esto hace posible escribir sus propios filtros personalizados y otras operaciones en Core Image en iOS, por lo que ya no será una gran ventaja para GPUImage. Por supuesto, cualquier persona que desee apuntar a una versión anterior de iOS todavía estará limitada por lo que Core Image pueda hacer allí, donde GPUImage puede apuntar a iOS 4.0.

Core Image también tiene algunas capacidades interesantes en términos de poder filtrar mientras una aplicación iOS está en segundo plano (al principio, basada en la CPU, pero iOS 8 agrega soporte de GPU para esto ahora), donde la dependencia de GPUImage en OpenGL ES impide se ejecuta cuando una aplicación está en segundo plano. Puede haber formas de evitar esta limitación en iOS 8, pero todavía no he revisado toda la documentación.

Mis intereses con GPUImage están en el campo de la visión artificial. Los filtros de imágenes son una distracción divertida, pero quiero usar este marco para explorar lo que es posible con el análisis de imágenes acelerado por GPU. Estoy trabajando en operaciones de reconocimiento y seguimiento de objetos arbitrarios, y esa es la dirección hacia la que evolucionaré continuamente el marco hacia. Sin embargo, tienes el código para el marco, por lo que no tienes que confiar en mí.

¿Cuáles son las principales diferencias entre los marcos de Core Image y GPUImage (además de que GPUImage es de código abierto)? De un vistazo, sus interfaces parecen bastante similares ... Aplicar una serie de filtros a una entrada para crear una salida. Veo algunas pequeñas diferencias, como el fácil de usar LookupFilter que tiene GPUImage. Estoy tratando de averiguar por qué alguien elegiría uno sobre el otro para una aplicación de filtrado de fotos.


Este es un hilo antiguo, pero creo que vale la pena señalar que GPUImage también tiene algunas características que no están presentes en Core Image: notablemente la transformada y varios filtros de detección de bordes.

Core Image parece tener que ver con la aplicación de filtros y efectos, y es bueno ver que GPUImage explora más en el análisis de imagen / video, se parece más a openCV, pero de una manera más eficiente.