# OpenCV

OpenCV es una biblioteca libre de visión artificial originalmente desarrollada por Intel. OpenCV significa Open Computer Vision (Visión Computacional Abierta). Desde que apareció su primera versión alfa en el mes de enero de 1999, se ha utilizado en una gran cantidad de aplicaciones, y hasta 2020 se la sigue mencionando como la biblioteca más popular de visión artificial. Detección de movimiento, reconocimiento de objetos, reconstrucción 3D a partir de imágenes, son sólo algunos ejemplos de aplicaciones de OpenCV.
Su popularidad se debe a que es:
* libre, publicada bajo licencia BSD, que permite que sea usada libremente para propósitos comerciales y de investigación
* multiplataforma, para los sistemas operativos GNU/Linux, Mac OS X, Windows y Android, y para diversas arquitecturas de hardware como x86, x64 (PC), ARM (celulares y Raspberry Pi)
* documentada y explicada: la organización tiene una preocupación activa de mantener la documentación de referencia para desarrolladores lo más completa y actualizada posible, ejemplos de uso de sus funciones y tutoriales accesibles al público no iniciado en visión artificial, además de difundir y fomentar libros y sitios de formación.
El proyecto pretende proporcionar un entorno de desarrollo fácil de utilizar y altamente eficiente. Esto se ha logrado realizando su programación en código C y C++ optimizados, aprovechando además las capacidades que proveen los procesadores multinúcleo. OpenCV puede además utilizar el sistema de primitivas de rendimiento integradas de Intel, un conjunto de rutinas de bajo nivel específicas para procesadores Intel (IPP).

## Aplicaciones

Las áreas de aplicación de OpenCV incluyen:
* Características 2D y 3D
* Estimación de pose de cámara
* Reconocimiento facial
* Reconocimiento de gestos
* Interacción persona-computadora
* Robótica móvil
* Comprensión de movimientos
* Reconocimiento de objetos
* Segmentación
* Estereoscopía
* Structure from motion (SFM)
* Tracking
* Realidad aumentada

## Lenguajes de programación

OpenCV está totalmente desarrollado en C++, orientado a objetos y con alta eficiencia computacional. Su API es C++ pero incluye conectores para otros lenguajes:
* Python
* Java
* Matlab
* Octave
* Javascript
La documentación y tutoriales se brindan para estos lenguajes, en orden de relevancia:
* C++
* Python
* Java
* Javascript

### OpenCV.JS

Es el nombre dado a conector de OpenCV para Javascript. Introducido en la versión 3.4 de OpenCV en diciembre de 2017, fue posible gracias a la nueva tecnología WebAssembly en los navegadores, anunciada en noviembre de ese año.
OpenCV.JS no está escrito en javascript. Técnicamente, es la compilación del código C++ de OpenCV en una máquina virtual WebAssembly, que se convierte en código nativo al ejecutarse en un navegador, lo que lo hace casi tan eficiente como la biblioteca nativa de OpenCV.
El soporte es parcial, sólo la parte principal de OpenCV fue portada a WebAssembly para que se pueda ejecutar en navegadores y usar con Javascript. Los tutoriales incluyen instrucciones para compilar cualquier otra parte de OpenCV, de modo que un desarrollador puede acceder a la biblioteca completa de OpenCV, pero mediante un trabajo arduo que requiere conocimiento experto, lo que deja fuera a la mayoría de los desarrolladores que quiere explorar el uso de OpenCV en navegadores.

## Multiplataforma

OpenCV ofrece soporte para varios sistemas operativos y varias arquitecturas de hardware, pero también ofrece el código fuente para que cualquier desarrollador lo compile en cualquier sistemas operativo y arquitectura particular.
OpenCV brinda instrucciones de instalación y opcionalmente binarios para estos sistemas operativos
* GNU/Linux
* Windows
* MacOs
* Android
* iOS
OpenCV se utiliza prácticamente en cualquier plataforma con capacidad suficiente, compilando su código fuente. De este modo se la utiliza en PC, celulares y placas de prototipado como Raspberry Pi o NVidia Jetson.
Hace uso de la paralelización a través de IPP y TBB.
Hace uso de la arquitectura híbrida cuando está disponible, a través de sus módulos CUDA y OpenCL, para aprovechar la potencia de procesamiento de las placas gráficas. No se debe confundir, OpenCV no brinda soporte para desarrolladores de CUDA, sino lo contrario: tiene un módulo escrito en CUDA para que los desarrolladores de C++ (y otros lenguajes soportados) puedan utilizarlo sin necesidad de escribir código CUDA.

## Historia de versiones

En 2020 OpenCV cuenta con líneas activas en paralelo, que difieren por su número de versión mayor :
* Versión 4
** C++ puro
** Desarrollo activo de nuevos módulos
** Versión actual: 4.3.0 (marzo de 2020)
* Versión 3
** C++ con compatibilidad hacia atrás
** Versión actual: 3.4.9 (diciembre de 2019)
* Versión 2.4.13
** C y C++
** El soporte consiste principalmente en depuración y corrección de errores. No se agregan activamente algoritmos nuevos.
** Versión actual y final: 2.4.13.6 (febrero de 2019)

### Hitos

* 4.0, noviembre de 2018
** Versión escrita enteramente en C++, abandonando todos los elementos expresados en puro C
** Quitaron gran parte de funciones obsoletas, que cuentan con alternativas superiores más modernas
** Esta depuración introdujo una incompatibilidad con la versión 3.4, que por este motivo se sigue desarrollando en paralelo
** Las incompatibilidades son puntuales, no impidió a la comunidad en general adoptar la versión 4.0
* 3.0, junio de 2015
** Versión dedicada a C++, abandonando el soporte a C
** El soporte a C continúa en las versiones 2.4.x, que se siguen desarrollando en paralelo
* 2.4.9, abril de 2014
** Concluye el proceso de adopción de C++
** Esta versión brinda soporte completo y mixto a C y C++
** Se continuó desarrollando hasta la 2.4.13
* 2.0, Octubre de 2009
** Adopción de C++, iniciando un proceso que concluirá en la versión 2.4.9
* alfa, 1999
** liberado al público en 2000

## Breve historia

Intel inició OpenCV en enero de 1999, liberando el código al público en 2000. Varias versiones alfa circularon con creciente adopción durante más de 5 años. Intel lanzó luego las versiones 1.0 (en 2006) y 2.0 (en 2009), y en agosto de 2012 delegó el proyecto a la fundación sin fines de lucro OpenCV.org, que mantiene su desarrollo y sitio web.
El continuo desarrollo de OpenCV se realiza exclusivamente por medio de voluntariado. Importantes compañías apoyan el desarrollo de OpenCV. Por ejemplo, el módulo SFM fue originalmente desarrollado durante varios años en el Google Summer Code.
La misión de OpenCV es proveer una infraestructura común para aplicaciones de visión artificial y acelerar su uso en productos comerciales, para lo cual ofrece su código libre bajo licencia BSD, de libre uso y modificación. Hace hincapié en la performance y en la facilidad de uso.