Hubiese sido genial que en esta clase se hubiese usado mas recursos visuales para entender lo que se esta haciendo.
Opino igual.
x3
Muchas cosas no se entienden con facilidad. Quizás usando recursos visuales sería mejor.
Me imagino que esta división de los frames depende también de la velocidad con que se realizó la grabación, osea si se grabó a 24 fps se realizara la división por 24, y así sucesivamente.
Configurar correctamente el seguimiento de centroides en OpenCV implica ajustar varios parámetros para detectar y seguir los objetos de interés de manera más precisa. Aquí algunos pasos que puedes tomar para mejorar y configurar el seguimiento de centroides en OpenCV:
### 1. **Ajustar el Método de Segmentación**
La segmentación es clave para detectar correctamente los objetos. Puedes experimentar con métodos de segmentación como:
- **Umbral Adaptativo**: Ayuda cuando la iluminación no es uniforme en la imagen.
- **Segmentación por Color**: Si los objetos tienen colores específicos, puedes usar máscaras de color en el espacio de color HSV.
```python
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_color = np.array([H_min, S_min, V_min]) # Ajusta estos valores
upper_color = np.array([H_max, S_max, V_max]) # Ajusta estos valores
mask = cv2.inRange(hsv, lower_color, upper_color)
```
- **Detección de Bordes (Canny)**: Puede ayudar a detectar contornos en objetos con bordes definidos.
```python
edges = cv2.Canny(gray, 100, 200)
```
### 2. **Filtrado de Contornos por Tamaño o Forma**
Para evitar la detección de ruido o pequeños objetos, filtra los contornos según su área o forma:
```python
min_area = 500 # Área mínima del contorno
for contour in contours:
if cv2.contourArea(contour) > min_area:
# Procesar el contorno si cumple con el área mínima
# ...
```
### 3. **Suavizar el Video (Filtro Gaussiano o Blur)**
Aplicar un filtro Gaussiano antes de la detección puede ayudar a reducir el ruido en la imagen:
```python
gray = cv2.GaussianBlur(gray, (5, 5), 0)
```
### 4. **Configuración del Cálculo del Centroide**
Asegúrate de que el cálculo del centroide se haga correctamente usando momentos. Si trabajas con varios objetos, puedes asignar un identificador único a cada uno y seguirlos en cada fotograma.
```python
M = cv2.moments(contour)
if M["m00"] != 0:
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
```
### 5. **Añadir Estabilidad al Centroide (Filtro de Promedio)**
Si el centroide varía mucho, puedes suavizar su movimiento usando un promedio móvil para estabilizar el seguimiento.
### 6. **Usar Algoritmos de Seguimiento Adicionales**
Si necesitas una mayor estabilidad en el seguimiento, puedes usar algoritmos como el filtro de Kalman o los trackers de OpenCV para una mejora considerable en la predicción y seguimiento de trayectorias.
```python
tracker = cv2.TrackerCSRT_create() # Puedes cambiar el tipo de tracker
tracker.init(frame, bbox) # bbox es el cuadro delimitador inicial del objeto
```
### Ejemplo Completo
Aquí tienes un ejemplo de código que combina algunos de estos ajustes:
import cv2
import numpy as np
\# Abre el video
cap = cv2.VideoCapture('video.mp4')min\_area =500# Área mínima para considerar un contorno válido
\# Variables para suavizar el centroide
alpha =0.7prev\_cX, prev\_cY =0,0whileTrue:  ret, frame = cap.read()  if not ret:  break  \# Conversión a escala de grises y suavizado  gray = cv2.cvtColor(frame, cv2.COLOR\_BGR2GRAY)  gray = cv2.GaussianBlur(gray, (5, 5), 0)  \# Umbralización adaptativa para segmentar  thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE\_THRESH\_GAUSSIAN\_C, cv2.THRESH\_BINARY, 11, 2)     \# Encontrar contornos  contours, \_ = cv2.findContours(thresh, cv2.RETR\_EXTERNAL, cv2.CHAIN\_APPROX\_SIMPLE)  for contour in contours:  if cv2.contourArea(contour) > min\_area:  M = cv2.moments(contour)  if M\["m00"] != 0:  cX = int(M\["m10"] / M\["m00"])  cY = int(M\["m01"] / M\["m00"])  \# Suavizar la posición del centroide  cX\_smooth = int(alpha \* prev\_cX + (1 - alpha) \* cX)  cY\_smooth = int(alpha \* prev\_cY + (1 - alpha) \* cY)     \# Actualizar las posiciones anteriores  prev\_cX, prev\_cY = cX\_smooth, cY\_smooth     \# Dibuja el centroide  cv2.circle(frame, (cX\_smooth, cY\_smooth), 7, (0, 255, 0), -1)  cv2.putText(frame, f"({cX\_smooth}, {cY\_smooth})", (cX\_smooth + 10, cY\_smooth), cv2.FONT\_HERSHEY\_SIMPLEX, 0.5, (0, 255, 0), 2)     \# Mostrar el resultado  cv2.imshow("Seguimiento de Centroides", frame)  if cv2.waitKey(1) & 0xFF == ord('q'):  breakcap.release()cv2.destroyAllWindows()
### Descripción de los Pasos:
1. **Umbralización Adaptativa**: Segmenta la imagen sin depender de un umbral fijo, lo cual es útil en condiciones de iluminación variable.
2. **Filtrado de Contornos por Área**: Asegura que solo se rastrean los objetos relevantes.
3. **Suavizado de Centroide**: Suaviza el movimiento del centroide para evitar fluctuaciones rápidas.
Estas configuraciones ayudan a mejorar la detección y el seguimiento de centroides en OpenCV, especialmente en situaciones de video en tiempo real o donde la iluminación puede variar.
La calidad de las clases ha ido disminuyendo, parece que me uní a un meet y el profesor iba explicando del tirón, a diferencia de las clases anteriores donde al menos se dedicaban tiempo de hacer visuales.