Seguimiento de objetos usando OpenCV

Manav Narula 30 enero 2023
  1. Rastreadores para seguimiento de objetos en OpenCV
  2. Usar rastreadores de objetos OpenCV en Python
  3. Conclusión
Seguimiento de objetos usando OpenCV

El seguimiento de objetos es una de las tareas importantes en Computer Vision que tiene muchas aplicaciones del mundo real. En el seguimiento de objetos, tratamos de distinguir diferentes objetos en función de algunos parámetros dados y rastrear su movimiento.

Recuerde que el seguimiento de objetos es diferente a la detección de objetos. Esto se debe a que el seguimiento de objetos es mucho más rápido, ya que no tendemos a detectar el objeto en cada cuadro, lo que aumenta la carga computacional.

La aplicación más común en la vida real del seguimiento de objetos es el seguimiento del movimiento de los vehículos en las carreteras. Podemos identificar diferentes vehículos y observar si cumplen o no las normas de circulación siguiendo su trayectoria.

Podemos usar la biblioteca opencv para trabajar con problemas de seguimiento de objetos en Python. Este tutorial discutirá los diferentes rastreadores disponibles en opencv para el seguimiento de objetos.

Rastreadores para seguimiento de objetos en OpenCV

El primer rastreador es el cv2.TrackerBoosting_create basado en el algoritmo AdaBoost de Machine Learning. Aprende usando las muestras positivas y negativas del objeto a rastrear en tiempo de ejecución, y no tiene un buen historial en los últimos tiempos y se considera muy lento.

Luego, tenemos el rastreador cv2.TrackerMIL_create basado en el algoritmo MIL. Fue construido como una mejora del rastreador BOOSTING y se basa en conceptos y factores similares en el vecindario de muestras positivas para distinguir objetos y mejorar la precisión general.

El rastreador cv2.TrackerKCF_create se basa en el enfoque matemático de las regiones superpuestas de múltiples coincidencias positivas en una MIL. La forma completa de KCF es Kernelized Correlation Filters, y se considera un rastreador decente y funciona muy bien para rastrear objetos individuales.

El rastreador cv2.TrackerCSRT_create se basa en el Filtro de Correlación Discriminativo con confiabilidad espacial y de canal. Filtra partes del cuadro utilizando el mapa de confiabilidad espacial que ayuda a seleccionar el objeto requerido y, para frecuencias de cuadro más bajas, brinda una gran precisión.

El rastreador cv2.TrackerMedianFlow_create es un rastreador avanzado que tiene como objetivo minimizar las fallas de seguimiento y elegir la ruta más confiable. Se detecta un objeto en tiempo real, se calcula su desplazamiento para avanzar y retroceder, y se compara la medición del error y la diferencia entre los dos valores para rastrear la trayectoria del objeto dado.

También tenemos el rastreador cv2.TrackerTLD_create. TLD significa seguimiento, aprendizaje y detección, y sigue la trayectoria de un objeto cuadro por cuadro. Utiliza la posición del cuadro anterior para corregir y mejorar el seguimiento.

La parte del detector se usa para rectificar el rastreador si se requiere usando el cuadro anterior. Maneja la superposición de objetos de manera muy eficiente.

El rastreador cv2.TrackerMOSSE_create, donde MOSSE significa la suma mínima de salida del error cuadrático, utiliza correlaciones adaptativas en el espacio de Fourier para rastrear objetos. Utiliza estos valores de correlación e intenta minimizar la suma de los errores cuadráticos entre la correlación real y la prevista.

Este rastreador tiene una velocidad de seguimiento muy alta y se adapta bien a los cambios de luz y del entorno del objeto.

Usar rastreadores de objetos OpenCV en Python

Usaremos el rastreador cv2.TrackerKCF_create en nuestro ejemplo para rastrear un objeto. Comenzaremos leyendo el video de muestra usando la función capture().

Luego, inicializamos una variable que realiza un seguimiento del objeto. Inicialmente, se asigna como None y ejecuta un ciclo que lee este video cuadro por cuadro.

Inicialmente, comprobamos si hubo seguimiento realizado en el cuadro anterior y continuamos con él si la variable inicializada no es None. Si no, seleccionamos el objeto que queremos rastrear usando la función selectROI.

Después de eso, usamos el objeto de seguimiento definido para rastrear este objeto en cada cuadro y mostrar información de seguimiento.

Ejemplo de código:

import cv2
import imutils

vid = cv2.VideoCapture("sample1.mp4")
initial_box = None
tracker = cv2.TrackerKCF_create()
while True:
    fr = vid.read()
    if fr is None:
        break
    if initial_box is not None:
        (success, box) = tracker.update(fr)
        if success:
            (x, y, w, h) = [int(v) for v in box]
            cv2.rectangle(fr, (x, y), (x + w, y + h), (0, 255, 0), 2)
        fps.update()
        fps.stop()
        information = [
            ("Success", "Yes" if success else "No"),
            ("FPS", "{:.3f}".format(fps.fps())),
        ]
        for (i, (k, v)) in enumerate(information):
            text = "{}: {}".format(k, v)
            cv2.putText(
                fr,
                text,
                (10, H - ((i * 20) + 20)),
                cv2.FONT_HERSHEY_SIMPLEX,
                0.6,
                (0, 0, 255),
                2,
            )
        cv2.imshow("Output Frame", fr)
        key = cv2.waitKey(1) & 0xFF
    initial_box = cv2.selectROI("fr", fr, fromCenter=False, showCrosshair=True)
    tracker.init(fr, initial_box)
    fps = FPS().start()

cv2.destroyAllWindows()

Conclusión

Discutimos los diferentes algoritmos utilizados para el seguimiento de objetos disponibles en la biblioteca opencv. Primero, discutimos el seguimiento de objetos y sus usos en la vida real.

Luego, discutimos en detalle los ocho rastreadores disponibles de la biblioteca opencv y un código de muestra sobre el manejo del seguimiento de objetos usando estos rastreadores.

Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

Artículo relacionado - Python OpenCV