Opencv implementa el seguimiento de un solo objetivo

Tabla de contenido

Se implementan ocho métodos de seguimiento en opencv.

Proceso de seguimiento de un solo objetivo:

Opencv implementa código de seguimiento de objetivo único


Se implementan ocho métodos de seguimiento en opencv.

  1. BOOSTING Tracker: el mismo algoritmo de aprendizaje automático utilizado detrás de las cascadas Haar (AdaBoost), pero tiene más de diez años. Este rastreador es más lento y no funciona tan bien, pero vale la pena mencionarlo como mayor. (Soporte mínimo para OpenCV 3.0.0)

  2. MIL Tracker: Más preciso que el rastreador anterior, pero con una mayor tasa de fallas. (Soporte mínimo para OpenCV 3.0.0)

  3. KCF Tracker: Más rápido que BOOSTING y MIL, pero no funciona bien bajo oclusión. (Soporte mínimo para OpenCV 3.1.0)

  4. CSRT Tracker: ligeramente más preciso que KCF, pero no tan rápido. (Soporte mínimo para OpenCV 3.4.2)

  5. MedianFlow Tracker: funciona bien al informar errores, pero para objetos que saltan o se mueven rápidamente, el modelo fallará. (Soporte mínimo para OpenCV 3.0.0)

  6. TLD Tracker: no estoy seguro de si existe alguna incompatibilidad entre OpenCV y TLD, pero TLD tiene muchos falsos positivos, por lo que no se recomienda. (Soporte mínimo para OpenCV 3.0.0)

  7. MOSSE Tracker: La velocidad es realmente rápida, pero no es tan alta como la precisión de CSRT y KCF, si buscas velocidad, puedes elegirla. (Soporte mínimo para OpenCV 3.4.1)

  8. GOTURN Tracker: este es el único detector de objetos basado en aprendizaje profundo en OpenCV. Requiere modelos adicionales para ejecutarse, que no se tratan en detalle en este artículo. (Soporte mínimo para OpenCV 3.2.0) Seguimiento de objetivos (2) GOTURN: Seguimiento de objetivos basado en aprendizaje profundo

nombre

actuación

KCF (filtros de correlación kernelizados)

La velocidad es 180 FPS más rápida , el efecto de seguimiento no es bueno y el cuadro no cambia de lejos a cerca

Impulsando

La velocidad es de 25 FPS , el efecto de seguimiento se puede rastrear pero se rastrea a otras personas y el cuadro de lejos a cerca permanece sin cambios.

MIL (aprendizaje de instancias múltiples)

La velocidad es 10 FPS más lenta, el efecto de seguimiento es bueno, pero puede rastrear a otras personas y el cuadro permanece sin cambios de lejos a cerca.

TLD (Seguimiento-Aprendizaje-Detección seguimiento, aprendizaje y detección)

La velocidad más lenta es 4 FPS, la deriva se produce en medio del efecto de seguimiento y el tamaño del cuadro se puede cambiar de lejos a cerca.

musgo La velocidad más rápida es 3000 FPS, el efecto de seguimiento es muy pobre y el cuadro no cambia de lejos a cerca

Flujo medio

La velocidad es 70 FPS más rápida , el efecto de seguimiento es deficiente y el cuadro no cambia de lejos a cerca

CSRT (Filtros de correlación discriminatoria con confiabilidad espacial y de canal)

La velocidad es de 30 FPS , el efecto de seguimiento es el mejor y el fotograma permanece sin cambios de lejos a cerca.

Glosario:

       Deriva en el seguimiento del objetivo: en pocas palabras, significa que durante el proceso de seguimiento, el filtro siempre se actualiza y el filtro actualizado no puede garantizar que el objetivo en el siguiente cuadro será rastreado por completo y habrá errores. Si no se procesa a tiempo, el filtro siempre se actualizará incorrectamente de esta manera y el rastreador no podrá rastrear el objetivo normalmente después de un cierto período de tiempo, lo cual es una deriva.

        Entonces la solución a la deriva no es más que controlar la actualización del filtro.

Resumir:

Si busca una alta precisión y puede tolerar una velocidad más lenta, utilice CSRT

Si los requisitos de precisión no son estrictos y desea buscar velocidad, elija KCF

Utilice MOSSE únicamente para ahorrar tiempo

Proceso de seguimiento de un solo objetivo:

  1. crear rastreador
    def createTypeTracker(tipo de rastreador):
  2. Lea el primer fotograma del vídeo y seleccione el objetivo a seguir
    # Leer el primer fotograma. 
    ok, fotograma = vídeo.read()
    # Descomente la línea siguiente para seleccionar un cuadro delimitador diferente 
    bbox = cv2.selectROI(frame, False)
  3. Inicializar rastreador
    tracker_type = 'MIL' 
    tracker = createTypeTracker(tipo_rastreador)
    # Inicializar el rastreador con el primer cuadro y el cuadro delimitador 
    ok = tracker.init(frame, bbox)
  4. Seguimiento con actualizaciones de vídeo
    # actualizar rastreador 
    ok, bbox = tracker.update(marco)

Opencv implementa código de seguimiento de objetivo único

import cv2
import sys

# 创建一个跟踪器,algorithm: KCF、CSRT、DaSiamRPN、GOTURM、MIL
trackerTypes = ['BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'GOTURN', 'MOSSE', 'CSRT']

def createTypeTracker(trackerType):
    if trackerType == trackerTypes[0]:
        tracker = cv2.legacy.TrackerBoosting_create()
    elif trackerType == trackerTypes[1]:
        tracker = cv2.TrackerMIL_create()
    elif trackerType == trackerTypes[2]:
        tracker = cv2.legacy.TrackerKCF_create()
    elif trackerType == trackerTypes[3]:
        tracker = cv2.legacy.TrackerTLD_create()
    elif trackerType == trackerTypes[4]:
        tracker = cv2.legacy.TrackerMedianFlow_create()
    elif trackerType == trackerTypes[5]: # 暂时存在问题
        tracker = cv2.TrackerGOTURN_create()
    elif trackerType == trackerTypes[6]:
        tracker = cv2.legacy.TrackerMOSSE_create()
    elif trackerType == trackerTypes[7]:
        tracker = cv2.legacy.TrackerCSRT_create()
    else:
        tracker = None

    return tracker


videoPth = 'E:\Python-Code/videodataset/enn.mp4'

if __name__ == '__main__':
    tracker_type = 'MIL'
    tracker = createTypeTracker(tracker_type)
    # 读取视频
    video = cv2.VideoCapture("E:\Python-Code/videodataset/enn.mp4")

    # 如果视频没有打开,退出。
    if not video.isOpened():
        print
        "Could not open video"
        sys.exit()

    # 读第一帧。
    ok, frame = video.read()
    if not ok:
        print('Cannot read video file')
        sys.exit()

    # 定义一个初始边界框
    bbox = (287, 23, 86, 320)

    # 取消注释下面的行以选择一个不同的边界框
    bbox = cv2.selectROI(frame, False)

    # 用第一帧和包围框初始化跟踪器
    ok = tracker.init(frame, bbox)

    while True:
        # 读取一个新的帧
        ok, frame = video.read()
        if not ok:
            break

        # 启动计时器
        timer = cv2.getTickCount()

        # 更新跟踪器
        ok, bbox = tracker.update(frame)

        # 计算帧率(FPS)
        fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);

        # 绘制包围框
        if ok:
            # 跟踪成功
            p1 = (int(bbox[0]), int(bbox[1]))
            p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))
            cv2.rectangle(frame, p1, p2, (255, 0, 0), 2, 1)
        else:
            # 跟踪失败
            cv2.putText(frame, "Tracking failure detected", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)

        # 在帧上显示跟踪器类型名字
        cv2.putText(frame, tracker_type + " Tracker", (100, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50, 170, 50), 2);

        # 在帧上显示帧率FPS
        cv2.putText(frame, "FPS : " + str(int(fps)), (100, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50, 170, 50), 2);

        # 显示结果
        cv2.imshow("Tracking", frame)

        # 按ESC键退出
        k = cv2.waitKey(1) & 0xff
        if k == 27: break

Supongo que te gusta

Origin blog.csdn.net/weixin_45823221/article/details/128470499
Recomendado
Clasificación