Holaaa.... ¿Existirá alguna forma de mostrar la clase de los objetos detectados en el video?
Hola Felipe claro que si, podrias crear un diccionario que contenga la key que es la que recibes desde la predicción y el nombre de la clase (Recuerda que el algoritmo te va a dar la clasificación con ids), y luego debes ponerlo con cv2 en forma de text en la misma ubicación del centroide.
Asi quedaria la declaración del diccionario.
classes ={0:"clase_1",1:"clase_2",2:"clase_3"}
Asi quedaria el lugar en donde debes agregar el diccionario para saber la clase
# Recorremos las detecciones
for x inrange(len(detection_clean)): idx =int(detections['detection_classes'][0][x]) # Aqui usamos el diccionario para obtener el nombre real de la clase.name_class= classes[idx] # Tomamos los bounding box
ymin, xmin, ymax, xmax = np.array(detections['detection_boxes'][0][x]) box =[xmin, ymin, xmax, ymax]* np.array([W,H,W,H])(startX, startY, endX, endY)= box.astype("int") # Con la función de dlib empezamos a hacer seguimiento de los boudiung box obtenidos
tracker = dlib.correlation_tracker() rect = dlib.rectangle(startX, startY, endX, endY) tracker.start_track(frame, rect) trackers.append(tracker)
Me cuentas que tal te va, saludos
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.
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 yup\_count =0down\_count =0
\# Parámetros de segmentación y detección
fgbg = cv2.createBackgroundSubtractorMOG2(history=100, varThreshold=50)
\# Posiciones previas de los centroides
prev\_positions ={}whileTrue:  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'):  breakcap.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.