25/02/2026
En el vasto universo de la programación, existen campos que cautivan por su potencial y sus infinitas aplicaciones. Uno de ellos es, sin duda, el tratamiento de imagen digital. Siempre quise adentrarme en este fascinante ámbito, pero las excusas para posponerlo eran constantes. Ahora, con un nuevo concurso en el horizonte y la determinación de romper esa barrera, he decidido que este es el momento perfecto para sumergirme de lleno. Y lo mejor de todo es que, a medida que aprenda, compartiré cada paso de este viaje contigo, desde los primeros desafíos hasta los descubrimientos más emocionantes.

Este primer artículo es el punto de partida. Exploraremos cómo inicié mi aventura, los obstáculos iniciales que encontré y cómo logré superarlos, con la esperanza de que mi experiencia te sirva de guía y te evite los tropiezos más comunes al principio. Si estás listo para transformar píxeles en información y creatividad, ¡continúa leyendo!
- ¿Por Qué el Tratamiento de Imagen Digital?
- OpenCV: El Gigante del Tratamiento de Imagen
- Preparando el Terreno: Instalación de OpenCV en Python
- Tus Primeros Pasos con OpenCV: La Ventana al Mundo Visual
- El Arte del Enmascarado: Aislando Elementos Clave
- Detectando Formas y Contornos: El Esqueleto de la Imagen
- El Tester Interactivo: Ajustando Parámetros en Tiempo Real
- Mejorando la Segmentación: Próximos Pasos Esenciales
- Tabla Comparativa: Librerías de Procesamiento de Imagen
- Preguntas Frecuentes sobre OpenCV y Tratamiento de Imagen
- Conclusión: Un Mundo de Posibilidades Visuales
¿Por Qué el Tratamiento de Imagen Digital?
Antes de sumergirnos en el código, es importante entender la relevancia del tratamiento de imagen. No se trata solo de aplicar filtros bonitos a tus fotos; va mucho más allá. El procesamiento de imágenes es la base de tecnologías cruciales en campos tan diversos como la medicina (diagnóstico por imagen), la seguridad (reconocimiento facial, vigilancia), la robótica (visión artificial para navegación y manipulación), la automoción (vehículos autónomos), la agricultura (monitoreo de cultivos) y el entretenimiento (efectos visuales en cine y videojuegos). La capacidad de extraer información útil de una imagen o vídeo es una habilidad invaluable en la era digital.
OpenCV: El Gigante del Tratamiento de Imagen
Cuando uno se inicia en el tratamiento digital de imagen, la primera gran decisión es elegir la herramienta adecuada. Si bien es posible construir algoritmos desde cero, la eficiencia y la complejidad de las tareas modernas hacen que el uso de librerías especializadas sea casi una obligación. Y entre todas las opciones, una destaca por encima del resto: OpenCV (Open Source Computer Vision Library).
¿Por qué elegir OpenCV?
OpenCV es una librería de visión artificial y aprendizaje automático de código abierto, diseñada para ofrecer una infraestructura común para las aplicaciones de visión por computadora. Programada originalmente en C++, su principal fortaleza radica en su versatilidad y su enorme comunidad. Estas son algunas de sus ventajas clave:
- Popularidad y Comunidad: Al ser la librería más conocida y utilizada en el ámbito del tratamiento de imagen, la cantidad de información disponible en línea es inmensa. Foros, tutoriales, ejemplos de código y soluciones a problemas comunes están a solo una búsqueda de distancia. Esto es crucial, especialmente cuando uno está aprendiendo y las dudas surgen constantemente.
- Rendimiento: A pesar de sus 'wrappers' para otros lenguajes, su núcleo en C++ garantiza un rendimiento excepcional, vital para tareas que requieren procesamiento en tiempo real.
- Multi-lenguaje y Multiplataforma: Aunque su base es C++, OpenCV cuenta con 'wrappers' para una gran variedad de lenguajes de programación, incluyendo Java, Python, C#, Android e iOS. Esto permite a los desarrolladores trabajar con su lenguaje preferido sin sacrificar la potencia de OpenCV. En nuestro caso, como ya habrás adivinado, utilizaremos Python. Aunque no lo considero el mejor lenguaje para programas de gran escala, su simplicidad y su enfoque en la legibilidad lo hacen idóneo para aprender y experimentar.
- Amplia Gama de Funcionalidades: Desde operaciones básicas como la lectura y escritura de imágenes hasta algoritmos avanzados de aprendizaje automático y reconocimiento de objetos, OpenCV lo cubre todo.
Alternativas a OpenCV
Aunque OpenCV es nuestra elección principal, es justo mencionar que existen otras librerías y marcos de trabajo para el tratamiento de imagen, cada uno con sus propias fortalezas. Algunas de ellas incluyen:
- Pillow (PIL Fork): Una librería de procesamiento de imágenes para Python, más orientada a tareas de edición y manipulación de imágenes estándar que a la visión por computadora avanzada.
- Scikit-image: Otra librería de procesamiento de imágenes en Python, que se integra bien con el ecosistema SciPy (NumPy, SciPy, Matplotlib) y ofrece una amplia gama de algoritmos.
- Dlib: Una librería de propósito general que también incluye herramientas para el procesamiento de imágenes y el aprendizaje automático, conocida por su rendimiento en tareas de reconocimiento facial.
Sin embargo, para empezar, la versatilidad, la comunidad y la documentación de OpenCV la convierten en la opción más robusta y amigable para el aprendizaje.
Preparando el Terreno: Instalación de OpenCV en Python
Para empezar a trabajar con OpenCV en Python, lo primero es configurar nuestro entorno. Utilizaremos Anaconda, una distribución de Python y R que simplifica la gestión de paquetes y entornos virtuales. Si bien hay tutoriales detallados para su instalación, el proceso se puede resumir en unos pocos pasos clave:
- Instalar Anaconda y Python: Descarga e instala Anaconda desde su sitio web oficial. Esto te proporcionará Python 3 y el gestor de paquetes
conda. - Instalar OpenCV y Utilidades Necesarias: Una vez que Anaconda está listo, abre tu terminal o Anaconda Prompt y ejecuta los siguientes comandos. Es crucial instalar estas librerías, ya que NumPy, SciPy y Matplotlib son fundamentales para el manejo de datos (imágenes son arrays numéricos) y la visualización en Python.
pip install numpy scipy matplotlib scikit-learn jupyter
Este comando instala:
- NumPy: La base para la computación numérica en Python. Las imágenes en OpenCV se representan como arrays de NumPy.
- SciPy: Librería para computación científica y técnica, que complementa a NumPy.
- Matplotlib: Para la creación de gráficos y la visualización de datos, muy útil para mostrar imágenes y resultados.
- Scikit-learn: Para algoritmos de aprendizaje automático, aunque no lo usaremos directamente en este post, es una herramienta común en el ecosistema.
- Jupyter: Para cuadernos interactivos, ideal para experimentar y documentar tu código.
pip install opencv-contrib-python imutilsCon este comando instalamos:
- opencv-contrib-python: La versión completa de OpenCV para Python, que incluye módulos adicionales que no están en la versión principal.
- imutils: Una colección de funciones de conveniencia para hacer que las operaciones básicas de procesamiento de imágenes con OpenCV sean más sencillas.
python en tu terminal o iniciar un cuaderno Jupyter) y ejecuta:import cv2 print(cv2.version)Si la salida es similar a '4.1.1' (o una versión más reciente), ¡felicidades! Estás listo para empezar.
Tus Primeros Pasos con OpenCV: La Ventana al Mundo Visual
Mi proyecto personal se centra en el procesamiento de vídeo en tiempo real. Sin embargo, dado que no todos tienen una cámara a mano, y la lógica aplicada a una imagen es directamente transferible a un flujo de vídeo (un vídeo es una secuencia de imágenes), comenzaremos con el ejemplo más básico: abrir y mostrar una imagen. Esto nos permitirá entender los componentes fundamentales de OpenCV.
Considera el siguiente código:
import cv2 img = cv2.imread('LaboratorioGluon.jpg') cv2.imshow("Imagen", img) cv2.waitKey(0) cv2.destroyAllWindows()Este fragmento es bastante autoexplicativo, pero desglosémoslo:
import cv2: Importa la librería OpenCV.img = cv2.imread('LaboratorioGluon.jpg'): Lee la imagen especificada por su ruta de archivo. Es importante que el archivo de imagen esté en el mismo directorio que tu script de Python, o que proporciones la ruta completa. Si la imagen no se encuentra,imgseráNone.cv2.imshow("Imagen", img): Abre una ventana y muestra la imagen. El primer argumento es el título de la ventana ('Imagen' en este caso) y el segundo es el objeto de la imagen que acabamos de cargar.cv2.waitKey(0): Esta función espera que el usuario presione una tecla. El argumento0significa que esperará indefinidamente hasta que se presione cualquier tecla. Si se le pasa un valor positivo (ej.1), esperará esa cantidad de milisegundos. Esto es crucial para los vídeos, donde se espera solo un breve instante entre fotogramas.cv2.destroyAllWindows(): Cierra todas las ventanas de OpenCV que estén abiertas. Es una buena práctica para liberar recursos.
La mayoría de los tutoriales, a partir de este punto, suelen saltar a una enumeración interminable de funciones de OpenCV. Sin embargo, lo que a menudo se omite es el flujo de trabajo estándar en el procesamiento de imágenes. Generalmente, el objetivo final es obtener información útil de la imagen, es decir, extraer características (features) que nos permitan tomar decisiones o realizar análisis.
El Arte del Enmascarado: Aislando Elementos Clave
Una de las herramientas fundamentales en el procesamiento de imágenes son las máscaras. Una máscara es, en esencia, una imagen binaria (blanco y negro) que nos permite seleccionar qué partes de la imagen original nos interesan o a qué partes queremos aplicar una modificación específica. El blanco (valor 255) indica 'seleccionado' o 'activo', y el negro (valor 0) indica 'ignorado' o 'inactivo'.
Para nuestro ejemplo, intentaremos separar el fondo de las letras en la imagen. Antes de empezar, es vital entender los espacios de color. Por defecto, OpenCV lee las imágenes en formato BGR (Azul, Verde, Rojo), que es lo opuesto al RGB (Rojo, Verde, Azul) al que estamos más acostumbrados en diseño gráfico. Sin embargo, para la segmentación basada en color, se prefiere el espacio de color HSV (Hue, Saturation, Value) debido a su robustez frente a los cambios de iluminación. Los rangos que maneja OpenCV para HSV son:
- Hue (Tono): 0 – 179
- Saturation (Saturación): 0 – 255
- Value (Valor/Brillo): 0 – 255
El primer paso es convertir nuestra imagen BGR a HSV usando cv2.cvtColor. Luego, con la ayuda de un 'color picker' en línea, podemos estimar que el color de las letras de 'Laboratorio Gluon' tiene un valor de Tono (Hue) aproximado de 25. Podríamos intentar seleccionar todos los píxeles con un Tono similar a 25.
Para esto, OpenCV nos proporciona la función cv2.inRange(...), que nos permite seleccionar píxeles que se encuentran dentro de un rango específico de valores HSV. Si queremos un rango alrededor de Hue 35, y no estamos seguros de los valores de Saturación y Brillo, podemos establecer rangos amplios para estos últimos. Por ejemplo, nuestros límites podrían ser:
- Límite inferior: (15, 0, 0) - Hue mínimo de 15, saturación y brillo mínimos de 0.
- Límite superior: (30, 255, 255) - Hue máximo de 30, saturación y brillo máximos de 255.
Veamos el código:
import cv2 img = cv2.imread('LaboratorioGluon.jpg') hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) mask = cv2.inRange(hsv, (15,0,0), (30,255,255)) cv2.imshow("Mascara", mask) cv2.imshow("Imagen Original", img) cv2.waitKey(0) cv2.destroyAllWindows()Al ejecutar este código, verás una ventana llamada "Mascara" donde las letras deberían aparecer en blanco sobre un fondo negro. Esto significa que hemos logrado separar las letras del fondo utilizando la máscara. Esta máscara es ahora un mapa de bits que podemos usar para aplicar operaciones solo a las partes seleccionadas de la imagen original.
Detectando Formas y Contornos: El Esqueleto de la Imagen
Una vez que tenemos una máscara con las manchas blancas que representan los objetos de interés, ¿qué hacemos con ella? El siguiente paso lógico, especialmente si nuestro objetivo es extraer características de la imagen o detectar puntos de ciertos colores o marcas, es identificar y obtener los datos de cada una de estas "manchas". Para ello, OpenCV nos ofrece la poderosa función cv2.findContours, que nos permite separar cada uno de los contornos presentes en la imagen binaria (nuestra máscara).
Un contorno es simplemente una curva que une todos los puntos continuos (a lo largo del límite) que tienen el mismo color o intensidad. Los contornos son una herramienta útil para el análisis de formas, la detección y el reconocimiento de objetos.
Por ejemplo, podemos extraer los contornos de cada una de las letras de la siguiente manera:
import cv2 img = cv2.imread('LaboratorioGluon.jpg') hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) mask = cv2.inRange(hsv, (15,0,0), (30,255,255)) cnts, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[-2:] # Dibujar los contornos en la imagen original for contour in cnts: cv2.drawContours(img, [contour], -1, (0, 255, 0), 2) # Color verde, grosor 2 cv2.imshow("Mascara", mask) cv2.imshow("Imagen con Contornos", img) cv2.waitKey(0) cv2.destroyAllWindows()En este código:
cnts, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[-2:]: Esta es la parte clave.mask: Es la imagen binaria (la máscara) donde se buscarán los contornos.cv2.RETR_TREE: Define el modo de recuperación de contornos.RETR_TREErecupera todos los contornos y reconstruye una jerarquía completa de contornos anidados.cv2.CHAIN_APPROX_NONE: Especifica el método de aproximación de contornos.CHAIN_APPROX_NONEalmacena absolutamente todos los puntos del contorno. Otros métodos pueden comprimir los puntos para ahorrar memoria.- La salida de
findContourses una tupla, donde el primer elemento son los contornos (cnts) y el segundo es su jerarquía (que aquí no usamos, por eso el_). El[-2:]es una forma de asegurarse de que se obtienen los valores correctos de la tupla de retorno, ya que la firma de retorno de la función ha cambiado ligeramente en diferentes versiones de OpenCV. for contour in cnts: cv2.drawContours(img, [contour], -1, (0, 255, 0), 2): Itera sobre cada contorno encontrado y lo dibuja en la imagen original (img).- El segundo argumento es una lista de contornos a dibujar (por eso
[contour]). -1: Indica que se deben dibujar todos los contornos.(0, 255, 0): Es el color del contorno en formato BGR (verde).2: Es el grosor de la línea del contorno.
El resultado será tu imagen original con las letras delineadas en verde, lo que demuestra cómo hemos logrado identificar las formas de los objetos de interés.

El Tester Interactivo: Ajustando Parámetros en Tiempo Real
Cuando estás empezando y experimentando con diferentes algoritmos de procesamiento de imágenes, es increíblemente útil poder modificar los parámetros en tiempo real y ver cómo afectan al resultado. OpenCV ha pensado en esto y nos proporciona los "Trackbars", unos deslizadores interactivos que podemos conectar directamente a nuestras variables para ajustar los rangos de Hue, Saturación y Valor, y observar el efecto en la máscara al instante.
Este código es un poco más denso, pero su lógica es simple: creamos una nueva ventana llamada 'Tester' y en ella, añadimos varios Trackbars. Cada Trackbar controlará uno de los límites (superior e inferior) de Hue, Saturación y Valor. Dentro de un bucle continuo, leeremos las posiciones actuales de estos Trackbars y las usaremos para recalcular la máscara. El bucle se mantendrá activo hasta que el usuario presione la tecla 'q'.
import cv2 import numpy as np def nothing(a): pass cv2.namedWindow('Tester') cv2.createTrackbar('HH','Tester',0,179,nothing) # Hue High cv2.createTrackbar('HL','Tester',0,179,nothing) # Hue Low cv2.createTrackbar('SH','Tester',0,255,nothing) # Saturation High cv2.createTrackbar('SL','Tester',0,255,nothing) # Saturation Low cv2.createTrackbar('VH','Tester',0,255,nothing) # Value High cv2.createTrackbar('VL','Tester',0,255,nothing) # Value Low img = cv2.imread('LaboratorioGluon.jpg') hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) key = cv2.waitKey(1) while not key == ord('q'): hh = cv2.getTrackbarPos('HH','Tester') hl = cv2.getTrackbarPos('HL','Tester') sh = cv2.getTrackbarPos('SH','Tester') sl = cv2.getTrackbarPos('SL','Tester') vh = cv2.getTrackbarPos('VH','Tester') vl = cv2.getTrackbarPos('VL','Tester') # Asegurarse de que los valores bajos no superen a los altos # Esto es una mejora para la robustez del tester if hl > hh: hl = hh if sl > sh: sl = sh if vl > vh: vl = vh lower_bound = np.array([hl,sl,vl], dtype=np.uint8) upper_bound = np.array([hh,sh,vh], dtype=np.uint8) mask = cv2.inRange(hsv, lower_bound, upper_bound) cv2.imshow("Mascara", mask) cv2.imshow("Imagen Original", img) key = cv2.waitKey(1) cv2.destroyAllWindows()Explicación adicional:
def nothing(a): pass: Esta es una función 'callback' quecreateTrackbarespera. Como no necesitamos realizar ninguna acción específica cuando el deslizador se mueve (simplemente leemos su posición en el bucle principal), usamos una función vacía.cv2.createTrackbar('HH','Tester',0,179,nothing): Crea un deslizador. Los argumentos son: nombre del trackbar ('HH'), nombre de la ventana donde se mostrará ('Tester'), valor inicial (0), valor máximo (179 para Hue), y la función callback.- El bucle
while not key == ord('q'):: Se ejecuta continuamente. En cada iteración, obtenemos los valores actuales de cada trackbar usandocv2.getTrackbarPos(). lower_bound = np.array([hl,sl,vl], dtype=np.uint8)yupper_bound = np.array([hh,sh,vh], dtype=np.uint8): Creamos los arrays NumPy para los límites inferior y superior de HSV. Es importante especificardtype=np.uint8ya que los píxeles de imagen son enteros sin signo de 8 bits.- La pequeña lógica para asegurar que
hl <= hh, etc., evita errores si el usuario arrastra el límite inferior por encima del superior. cv2.waitKey(1)dentro del bucle: Es crucial para permitir que la ventana se actualice y responda a los eventos del teclado y del trackbar.
Este tester es una herramienta inmensamente valiosa para la depuración y el ajuste fino de tus algoritmos de segmentación, permitiéndote encontrar los rangos de color óptimos de forma visual e intuitiva.
Mejorando la Segmentación: Próximos Pasos Esenciales
Para ir empezando a segmentar y a probar cosas, lo que hemos visto es más que suficiente. Sin embargo, para obtener resultados más robustos y limpios, especialmente cuando se trata de imágenes con ruido o imperfecciones, es interesante explorar algunas funciones adicionales de OpenCV. Estas operaciones morfológicas y de filtrado son fundamentales para refinar nuestras máscaras y la detección de contornos:
cv2.erodeycv2.dilate: Estas son operaciones morfológicas.- Erosión (
erode): Reduce el tamaño de los objetos en primer plano (blancos) y es útil para eliminar pequeños ruidos blancos o para desconectar objetos que están ligeramente unidos. - Dilatación (
dilate): Aumenta el tamaño de los objetos en primer plano (blancos) y es útil para rellenar pequeños agujeros en los objetos o para conectar componentes que están ligeramente separados. cv2.GaussianBlurycv2.medianBlur: Son filtros de suavizado.- Filtro Gaussiano (
GaussianBlur): Suaviza la imagen difuminando los píxeles. Es efectivo para reducir el ruido aleatorio y preparar la imagen para la detección de bordes o contornos. - Filtro Mediana (
medianBlur): Reemplaza cada píxel con la mediana de los píxeles vecinos. Es particularmente eficaz para eliminar el ruido de tipo 'sal y pimienta' sin difuminar excesivamente los bordes.
La combinación de estas técnicas te permitirá obtener máscaras mucho más precisas y, por ende, una mejor extracción de características.
Tabla Comparativa: Librerías de Procesamiento de Imagen
| Característica | OpenCV | Pillow (PIL Fork) | Scikit-image |
|---|---|---|---|
| Enfoque Principal | Visión por Computadora, Aprendizaje Automático, Procesamiento en tiempo real | Manipulación y Edición de imágenes generales | Algoritmos de procesamiento de imágenes científicos |
| Lenguajes Soportados | C++, Python, Java, C#, etc. | Python | Python |
| Rendimiento | Muy alto (núcleo C++) | Bueno (para tareas generales) | Bueno (optimizado con NumPy) |
| Comunidad / Documentación | Extensa y muy activa | Activa, buena documentación | Activa, excelente documentación y ejemplos |
| Casos de Uso Típicos | Detección de objetos, seguimiento, reconocimiento facial, robótica, vehículos autónomos | Redimensionamiento, recorte, filtros básicos, composiciones | Análisis de imágenes médicas, microscopía, investigación científica |
Preguntas Frecuentes sobre OpenCV y Tratamiento de Imagen
¿Es OpenCV difícil de aprender para un principiante?
OpenCV puede parecer intimidante al principio debido a su vasta cantidad de funciones y conceptos de visión por computadora. Sin embargo, con un enfoque gradual, empezando por lo básico (como la lectura de imágenes y las máscaras), y utilizando lenguajes como Python que simplifican la sintaxis, es bastante accesible. La clave está en la práctica constante y en aprovechar la abundante documentación y ejemplos disponibles.
¿Necesito saber C++ para usar OpenCV en Python?
No, en absoluto. Aunque el núcleo de OpenCV está escrito en C++, los 'wrappers' de Python te permiten acceder a todas sus funcionalidades directamente desde Python sin necesidad de escribir una sola línea de C++. La ventaja es que obtienes el rendimiento de C++ con la facilidad de uso de Python.
¿Qué tipo de proyectos puedo realizar con OpenCV?
Las posibilidades son casi ilimitadas. Puedes crear sistemas de reconocimiento facial, detectores de objetos (como vehículos o personas), aplicaciones de realidad aumentada, sistemas de vigilancia inteligentes, herramientas de edición de fotos automatizadas, asistentes para vehículos autónomos, y mucho más. Desde el análisis de imágenes médicas hasta la clasificación de productos en una fábrica, OpenCV es una herramienta fundamental.
¿Cómo maneja OpenCV los diferentes formatos de imagen?
OpenCV es compatible con una amplia variedad de formatos de imagen populares, como JPEG, PNG, TIFF, BMP, entre otros. La función cv2.imread() se encarga de leer automáticamente el formato y convertirlo a la representación interna de OpenCV (generalmente un array NumPy BGR). De manera similar, cv2.imwrite() puede guardar imágenes en diferentes formatos.
¿Es OpenCV útil para el procesamiento de vídeo en tiempo real?
Absolutamente. OpenCV está diseñado para ser eficiente y es ampliamente utilizado en aplicaciones de vídeo en tiempo real. Funciones como cv2.VideoCapture() permiten acceder a cámaras o archivos de vídeo, y el procesamiento fotograma a fotograma puede realizarse con una latencia mínima, lo que lo hace ideal para seguimiento de objetos, reconocimiento de gestos o sistemas de vigilancia.
Conclusión: Un Mundo de Posibilidades Visuales
Este primer vistazo a OpenCV y al tratamiento de imagen es solo el comienzo de un viaje fascinante. Hemos cubierto los fundamentos: desde la instalación del entorno en Python con Anaconda, hasta las operaciones básicas de lectura y visualización, pasando por técnicas esenciales como el enmascarado y la detección de contornos. Hemos aprendido que la clave para extraer información útil de una imagen reside en comprender su estructura y manipularla adecuadamente.
El tester interactivo con los Trackbars es un ejemplo perfecto de cómo OpenCV facilita la experimentación y el ajuste fino, una herramienta invaluable para cualquier desarrollador. Si bien lo que hemos visto es suficiente para empezar, te animo a explorar las funciones de suavizado y operaciones morfológicas (cv2.erode, cv2.dilate, cv2.GaussianBlur, cv2.medianBlur) para llevar tus segmentaciones al siguiente nivel.
En el próximo post, profundizaremos aún más, abordando cómo podemos utilizar la imagen de una cámara para obtener la posición de la misma y detectar objetos en el espacio. Además, exploraremos cómo eliminar el fondo estático en vídeos, abriendo la puerta a aplicaciones aún más dinámicas. El mundo de la visión por computadora es inmenso y gratificante, ¡así que sigue explorando y creando!
Si quieres conocer otros artículos parecidos a OpenCV: Domina el Tratamiento de Imagen con Python puedes visitar la categoría Librerías.
