Comprender la visión computarizada

1

¿Por qué aprender computer vision?

2

¿Qué es la visión computarizada?

3

Tipos de visión computarizada

4

Introducción a object detection: clasificación + localización

5

Aprende a identificar problemas

Dimensionamiento de proyecto de visión computarizada

6

Cómo definir los tiempos de tu proyecto

7

Cómo costear tu proyecto

8

Cómo identificar los roles necesarios en el proyecto

9

Producto mínimo viable en computer vision

Obtención y procesamiento de los datos

10

Obtención de datos para tu proyecto

11

Limpieza de la base de datos

12

Distribución de datos en entrenamiento y testeo

13

Etiquetado de los datos de test

14

Etiquetado de los datos de train

15

Transforma tu base de datos a TFRecord

16

Transformar CSV a TFRecord

Entrena, testea y optimiza tus modelos

17

Librerías a importar durante fase de entrenamiento

18

Fase de entrenamiento del modelo

19

Balanceo de imágenes y data augmentation

20

Entrena, evalua y optimiza con TensorBoard

21

Validación de modelo en un entorno de ejecución

22

Re-entrenamiento del modelo para obtener mejores resultados

23

Seguimiento de centroides con OpenCV

24

Configuración de los centroides con OpenCV

25

Algoritmo de dirección y conteo con OpenCV

26

Crea un ciclo de entrenamiento de tu modelo: MLOps

Producto con visión computarizada en producción

27

Prepara tu entorno en Google Cloud Platform

28

Carga y preprocesamiento de modelos

29

Postprocesamiento de modelos

30

Despliega y consume tu modelo en producción

31

Bonus: aprende a apagar las máquinas de GCP para evitar sobrecostos

Siguientes pasos en inteligencia artificial

32

Siguientes pasos en inteligencia artificial

33

Comparte tu proyecto de detección de vehículos en carretera y certifícate

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Convierte tus certificados en títulos universitarios en USA

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

17 Días
11 Hrs
0 Min
4 Seg

Algoritmo de dirección y conteo con OpenCV

25/33
Recursos

Aportes 2

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Ayudaría bastante poner las guías de identación.

Un algoritmo de dirección y conteo con OpenCV es útil en aplicaciones donde se desea contar objetos que se mueven en una dirección específica, como en sistemas de monitoreo de tráfico o conteo de personas en una entrada. Aquí te doy un ejemplo básico de cómo implementar un sistema de conteo con dirección usando OpenCV. \### Conceptos Básicos del Algoritmo 1\. \*\*Detección de Objetos\*\*: Identificar objetos en movimiento en cada fotograma. 2\. \*\*Definir una Línea de Conteo\*\*: Una línea imaginaria a través de la cual se deben mover los objetos para ser contados. La dirección de cruce se determina dependiendo del lado de entrada y salida. 3\. \*\*Determinar la Dirección\*\*: Verificar la posición actual y la anterior de cada objeto para saber en qué dirección se mueve. 4\. \*\*Conteo de Objetos\*\*: Incrementar el contador de acuerdo con la dirección del movimiento cuando un objeto cruza la línea. \### Implementación Este ejemplo realiza un seguimiento de centroides de objetos en movimiento y cuenta cuántos cruzan una línea imaginaria en una dirección específica. ```python import cv2 import numpy as np \# Abre el video cap = cv2.VideoCapture('video.mp4') \# Parámetros de conteo line\_y = 300 # Posición de la línea de conteo en el eje y up\_count = 0 down\_count = 0 \# Parámetros de segmentación y detección fgbg = cv2.createBackgroundSubtractorMOG2(history=100, varThreshold=50) \# Posiciones previas de los centroides prev\_positions = {} while True: ret, frame = cap.read() if not ret: break \# Preprocesamiento: conversión a escala de grises y suavizado gray = cv2.cvtColor(frame, cv2.COLOR\_BGR2GRAY) gray = cv2.GaussianBlur(gray, (5, 5), 0) \# Aplicar sustracción de fondo fgmask = fgbg.apply(gray) \# Eliminar ruido \_, thresh = cv2.threshold(fgmask, 240, 255, cv2.THRESH\_BINARY) thresh = cv2.dilate(thresh, None, iterations=2) \# Encontrar contornos contours, \_ = cv2.findContours(thresh, cv2.RETR\_EXTERNAL, cv2.CHAIN\_APPROX\_SIMPLE) \# Dibuja la línea de conteo cv2.line(frame, (0, line\_y), (frame.shape\[1], line\_y), (255, 0, 0), 2) \# Procesar cada contorno encontrado for contour in contours: if cv2.contourArea(contour) > 500: # Filtra contornos pequeños M = cv2.moments(contour) if M\["m00"] != 0: cX = int(M\["m10"] / M\["m00"]) cY = int(M\["m01"] / M\["m00"]) \# Asigna un ID al objeto usando el centroide como referencia obj\_id = f"{cX}\_{cY}" \# Verificar posición anterior para detectar dirección if obj\_id in prev\_positions: prev\_cX, prev\_cY = prev\_positions\[obj\_id] \# Si cruza hacia arriba if prev\_cY > line\_y and cY <= line\_y: up\_count += 1 print(f"Subiendo: {up\_count}") \# Si cruza hacia abajo elif prev\_cY < line\_y and cY >= line\_y: down\_count += 1 print(f"Bajando: {down\_count}") \# Actualiza la posición anterior del objeto prev\_positions\[obj\_id] = (cX, cY) \# Dibuja el centroide y dirección en el fotograma cv2.circle(frame, (cX, cY), 5, (0, 255, 0), -1) cv2.putText(frame, f"ID: {obj\_id}", (cX + 10, cY), cv2.FONT\_HERSHEY\_SIMPLEX, 0.5, (0, 255, 0), 2) \# Muestra el conteo en el video cv2.putText(frame, f"Conteo Arriba: {up\_count}", (10, 30), cv2.FONT\_HERSHEY\_SIMPLEX, 0.6, (0, 0, 255), 2) cv2.putText(frame, f"Conteo Abajo: {down\_count}", (10, 60), cv2.FONT\_HERSHEY\_SIMPLEX, 0.6, (0, 0, 255), 2) \# Mostrar el fotograma cv2.imshow("Dirección y Conteo", frame) \# Salir si se presiona 'q' if cv2.waitKey(30) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ``` \### Explicación del Código 1\. \*\*Definición de Parámetros de Conteo\*\*: \- `line\_y`: Posición de la línea en el eje y que los objetos deben cruzar para ser contados. \- `up\_count` y `down\_count`: Contadores de objetos que se mueven en direcciones opuestas. 2\. \*\*Sustracción de Fondo\*\*: \- Usamos `cv2.createBackgroundSubtractorMOG2` para detectar objetos en movimiento, ya que esta técnica elimina el fondo estático y resalta los objetos en movimiento. 3\. \*\*Limpieza de Ruido\*\*: \- Se usa dilatación (`cv2.dilate`) para eliminar el ruido en la imagen binaria después de la sustracción de fondo. 4\. \*\*Identificación de Objetos\*\*: \- Detectamos los contornos de los objetos y filtramos los más pequeños. 5\. \*\*Cálculo del Centroide y Seguimiento\*\*: \- Calculamos el centroide de cada contorno usando los momentos. \- Cada objeto es identificado por su centroide. Esto es simplificado para la detección, pero en una implementación más avanzada, podrías usar un algoritmo de seguimiento de objetos como `cv2.Tracker` o un identificador basado en distancia o en propiedades del objeto. 6\. \*\*Detección de Dirección\*\*: \- Verificamos la posición previa de cada objeto y, si cruza la línea en dirección hacia arriba o hacia abajo, incrementamos el conteo correspondiente. 7\. \*\*Dibujo y Visualización\*\*: \- Se muestra el centroide, ID y contadores en pantalla. \- La línea de conteo se dibuja para indicar la posición de cruce. \### Mejoras Potenciales \- \*\*Asignación de ID a Objetos\*\*: Para un seguimiento más preciso, podrías usar técnicas de asociación de centroides basadas en distancia, como el algoritmo de `detección de proximidad más cercana`. \- \*\*Filtro de Kalman\*\*: Si deseas mayor estabilidad y predicción en el movimiento, puedes usar un filtro de Kalman para suavizar la trayectoria. \- \*\*Trackers de OpenCV\*\*: OpenCV incluye varios algoritmos de seguimiento (`KLT`, `CSRT`, `MedianFlow`, etc.) que puedes utilizar para mejorar el seguimiento de objetos entre fotogramas. Este código proporciona una base funcional para un sistema de conteo direccional y es extensible para aplicaciones como conteo de vehículos, personas o cualquier objeto en movimiento.