Lección 5-2: Operación de video OpenCV --- seguimiento de video

objetivo de aprendizaje

  • meanshiftprincipios de comprensión
  • conocer camshiftel algoritmo
  • Capacidad para utilizar meanshifty Camshiftrealizar seguimiento de objetivos.

1.desplazamiento medio

1.1 Principio

cambio medioEl principio del algoritmo me an hif t es muy simple . Supongamos que tiene un montón de conjuntos de puntos y una ventana pequeña. Esta ventana puede ser circular. Ahora es posible que desee mover esta ventana al área con la mayor densidad de conjuntos de puntos.

Como se muestra abajo:

Insertar descripción de la imagen aquí
La primera ventana es el área del anillo azul, llamada C 1 C1C1._ _ _ El centro del anillo azul está marcado con un rectángulo azul y se denomina C1_o.

El centroide formado por el conjunto de puntos de todos los puntos en la ventana está en el punto circular azul C1_r. Obviamente, el centroide y el centroide del anillo circular no coinciden. Por tanto, mueva la ventana azul para que el centroide coincida con el centroide obtenido previamente. Encuentre nuevamente el centro de masa del conjunto de puntos rodeado por el anillo en el área del anillo recién movido y luego muévase nuevamente. Normalmente, el centro de masa y el centro de masa no coinciden. Continúe realizando el proceso de movimiento anterior hasta que el centro de gravedad y el centro de masa coincidan aproximadamente. De esta manera, la ventana circular final caerá al lugar con la mayor distribución de píxeles, que es el círculo verde de la imagen, denominado C2.

cambio medioAdemás de usarse en el seguimiento de video, el algoritmo me ans hift tiene aplicaciones importantes en agrupamiento, suavizado y otras situaciones que involucran datos y aprendizaje no supervisado . Es un algoritmo ampliamente utilizado .

La imagen es una información matricial ¿Cómo utilizar el cambio medio en un vídeo?¿ Qué pasa con el algoritmo meanshift para rastrear un objeto en movimiento ? El proceso general es el siguiente:

  1. Primero seleccione un área objetivo en la imagen.

  2. Calcule la distribución del histograma del área seleccionada, generalmente el histograma del espacio de color HSV.

  3. La distribución del histograma también se calcula para la imagen del siguiente cuadro b.

  4. Calcular imagen bbEl área en b que es más similar a la distribución del histograma del área seleccionada, use desplazamiento medio desplazamiento medioEl algoritmo me ans hift mueve el área seleccionada a lo largo de la parte más similar hasta que se encuentra el área más similar, luego se completa el seguimiento del objetivo en la imagen b .

  5. Repita el proceso del 3 al 4 para completar todo el seguimiento del objetivo del vídeo.

    Normalmente, utilizamos la imagen obtenida por la retroproyección del histograma y la posición inicial del objeto objetivo en el primer cuadro. Cuando el movimiento del objeto objetivo se reflejará en el mapa de retroproyección del histograma, el algoritmo de desplazamiento medio mueve nuestra ventana a la posición opuesta: Al área con la mayor densidad de escala de grises en la imagen proyectada. Como se muestra abajo:
    Insertar descripción de la imagen aquí

El proceso de retroproyección de histograma es:

Supongamos que tenemos una imagen de entrada de 100 x 100 y una imagen de plantilla de 10 x 10. El proceso de búsqueda es el siguiente:

  1. Comenzando desde la esquina superior izquierda (0,0) de la imagen de entrada, corte una imagen temporal de (0,0) a (10,10);
  2. Generar un histograma de una imagen temporal;
  3. Compare el histograma de la imagen temporal con el histograma de la imagen de plantilla y el resultado de la comparación se registra como c;
  4. El resultado de la comparación del histograma c es el valor de píxel en (0,0) de la imagen resultante;
  5. Corte la imagen de entrada en una imagen temporal de (0,1) a (10,11), compare el histograma y registre la imagen resultante;
  6. Repita los pasos del 1 al 5 hasta la esquina inferior derecha de la imagen de entrada, formando la proyección posterior del histograma.
1.2 Implementación

La API para implementar Meanshift en OpenCV es:

cv.meanShift(probImage, window, criteria)

parámetro:

  • probImage: Área ROI, es decir, la proyección posterior del histograma del objetivo

  • window: La ventana de búsqueda inicial es el rect que define el ROI

  • criteria: Determine los criterios para detener la búsqueda de la ventana, incluyendo principalmente que el número de iteraciones alcance el valor máximo establecido, que el valor de deriva del centro de la ventana sea mayor que un cierto límite establecido, etc.

El proceso principal de implementación de Meanshift es:

  1. Leer archivo de vídeo:cv.videoCapture()
  2. Configuración de región de interés: obtenga el primer fotograma de la imagen y establezca el área de destino, es decir, la región de interés.
  3. Calcular histograma: Calcula HSVel histograma del área de interés y normalízalo
  4. Seguimiento de objetivos: establezca la condición de parada de búsqueda de la ventana, proyecte hacia atrás el histograma, realice el seguimiento de objetivos y dibuje un marco rectangular en la posición de destino.

Ejemplo:

import numpy as np
import cv2 as cv
# 1.获取图像
cap = cv.VideoCapture('DOG.wmv')

# 2.获取第一帧图像,并指定目标位置
ret,frame = cap.read()
# 2.1 目标位置(行,高,列,宽)
r,h,c,w = 197,141,0,208  
track_window = (c,r,w,h)
# 2.2 指定目标的感兴趣区域
roi = frame[r:r+h, c:c+w]

# 3. 计算直方图
# 3.1 转换色彩空间(HSV)
hsv_roi =  cv.cvtColor(roi, cv.COLOR_BGR2HSV)
# 3.2 去除低亮度的值
# mask = cv.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
# 3.3 计算直方图
roi_hist = cv.calcHist([hsv_roi],[0],None,[180],[0,180])
# 3.4 归一化
cv.normalize(roi_hist,roi_hist,0,255,cv.NORM_MINMAX)

# 4. 目标追踪
# 4.1 设置窗口搜索终止条件:最大迭代次数,窗口中心漂移最小值
term_crit = ( cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1 )

while(True):
    # 4.2 获取每一帧图像
    ret ,frame = cap.read()
    if ret == True:
        # 4.3 计算直方图的反向投影
        hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
        dst = cv.calcBackProject([hsv],[0],roi_hist,[0,180],1)

        # 4.4 进行meanshift追踪
        ret, track_window = cv.meanShift(dst, track_window, term_crit)

        # 4.5 将追踪的位置绘制在视频上,并进行显示
        x,y,w,h = track_window
        img2 = cv.rectangle(frame, (x,y), (x+w,y+h), 255,2)
        cv.imshow('frame',img2)

        if cv.waitKey(60) & 0xFF == ord('q'):
            break        
    else:
        break
# 5. 资源释放        
cap.release()
cv.destroyAllWindows()

Los siguientes son los resultados del seguimiento de tres fotogramas de imágenes:

Insertar descripción de la imagen aquí

2 cambios de levas

Si observa detenidamente los resultados anteriores, hay un problema: el tamaño de la ventana de detección es fijo y el perro es un proceso gradualmente más pequeño de cerca a lejos. Una ventana fija no es apropiada. Por lo tanto, debemos corregir el tamaño y el ángulo de la ventana según el tamaño y el ángulo del objetivo. CamShift CamShiftCamShift puede ayudarnos a resolver este problema .

CamShift CamShiftEl nombre completo del algoritmo C am Shift es "Continuously Adaptive Mean-Shift" (algoritmo de cambio medio continuamente adaptable). Es un algoritmo mejorado para el algoritmo MeanShift. Puede ajustar el tamaño de la ventana de búsqueda en tiempo real como el El tamaño del objetivo de seguimiento cambia y tiene un mejor rendimiento .

Cambio de levas Cambio de levasEl algoritmo de cambio de levas primero aplica elcambio medio.m e an s hi f t,一旦cambio medio cambio medioCuando converge , actualiza el tamaño de la ventana y también calcula la dirección de la elipse que mejor se ajusta para actualizar la ventana de búsqueda según la ubicación y el tamaño del objetivo . Como se muestra en la siguiente figura:
Insertar descripción de la imagen aquí
Cuando Camshift se implementa en OpenCV, simplemente cambie la función de cambio medio anterior a la función Camshift:

En cambio de cámara:

 # 4.4 进行meanshift追踪
        ret, track_window = cv.meanShift(dst, track_window, term_crit)

        # 4.5 将追踪的位置绘制在视频上,并进行显示
        x,y,w,h = track_window
        img2 = cv.rectangle(frame, (x,y), (x+w,y+h), 255,2)

Cambiar a:

  #进行camshift追踪
    ret, track_window = cv.CamShift(dst, track_window, term_crit)

        # 绘制追踪结果
        pts = cv.boxPoints(ret)
        pts = np.int0(pts)
        img2 = cv.polylines(frame,[pts],True, 255,2)

3 Resumen del algoritmo

Tanto el algoritmo Meanshift como el camshift tienen sus propias ventajas y desventajas:

  • Algoritmo de cambio medio: simple, con pocas iteraciones, pero no puede resolver el problema de oclusión del objetivo y no puede adaptarse a los cambios en la forma y el tamaño de los objetivos en movimiento.

  • Algoritmo Camshift: puede adaptarse a los cambios en el tamaño y la forma de los objetivos en movimiento y tiene mejores efectos de seguimiento. Sin embargo, cuando el color de fondo y el color del objetivo están cerca, es fácil agrandar el área del objetivo, lo que eventualmente puede conducir a la pérdida del seguimiento del objetivo.


Resumir

  1. cambio medio

    Principio: un paso iterativo, es decir, primero calcule la media de desplazamiento del punto actual, mueva el punto a su media de desplazamiento y luego utilícelo como un nuevo punto de partida para continuar moviéndose hasta que se cumplan ciertas condiciones.

    API:cv.meanshift()

    Ventajas y desventajas: simple, con pocas iteraciones, pero no puede resolver el problema de oclusión del objetivo y no puede adaptarse a los cambios en la forma y el tamaño de los objetivos en movimiento.

  2. cambio de levas

    Principio: una mejora en el algoritmo de desplazamiento medio, primero se aplica el desplazamiento medio, una vez que el desplazamiento medio converge, actualiza el tamaño de la ventana y también calcula la dirección de la elipse que mejor se ajusta, actualizando así la ventana de búsqueda de acuerdo con la ubicación y el tamaño de la objetivo.

    API:cv.camshift()

    Ventajas y desventajas: puede adaptarse a los cambios en el tamaño y la forma de los objetivos en movimiento y tiene buenos efectos de seguimiento. Sin embargo, cuando el color de fondo y el color del objetivo están cerca, es fácil agrandar el área del objetivo, lo que eventualmente puede conducir a la pérdida del seguimiento del objetivo.

Supongo que te gusta

Origin blog.csdn.net/m0_51366201/article/details/132651641
Recomendado
Clasificación