Seguimiento de objetivos tradicional: método de segmentación en segundo plano

Tabla de contenido

1. Segmentación de antecedentes

2. Proceso

3. Código

Cuatro Resumen


1. Segmentación de antecedentes

        Los métodos tradicionales de segmentación en primer plano y en segundo plano incluyen GrabCut, algoritmo de cuenca y, por supuesto, algunos algoritmos de segmentación de umbral. Sin embargo, estos algoritmos a menudo parecen ser menos robustos en su aplicación y no pueden lograr un buen efecto de segmentación.

        Los algoritmos modernos de segmentación en segundo plano incorporan algunos métodos de aprendizaje automático para mejorar el efecto de clasificación. Como KNN, gaussiano mixto (MOG2), multicuadrícula geométrica . El principio básico de estos algoritmos es aprender el entorno de cada imagen de cuadro para inferir el área de fondo.

BackgroundSubtractor         de OpenCV proporciona estos modernos algoritmos de segmentación en segundo plano.

        El principio es eliminar las cosas que no se mueven.

2. Proceso

Actualmente opencv4 implementa una variedad de funciones de segmentación en segundo plano,

¿Qué tipos de algoritmos de segmentación de fondo/primer plano de vídeo (modelado de fondo/extracción de primer plano) existen en OpenCV4, cuáles son sus respectivos principios y características de algoritmo, y se adjuntan códigos de muestra?

3. Código

        Tome KNN como ejemplo para implementar

import numpy as np
import cv2
from skimage.segmentation import slic, mark_boundaries


camera = cv2.VideoCapture("E:\Python-Code/videodataset/enn.mp4")

bs = cv2.createBackgroundSubtractorKNN(detectShadows=True)  # 类实例一个对象
# mog1 = cv2.bgsegm.createBackgroundSubtractorMOG()  # 创建mog对象
# mog2 = cv2.createBackgroundSubtractorMOG2()
# mog3 = cv2.bgsegm.createBackgroundSubtractorGMG(30)  # 初始化帧数取30吧

while (camera.isOpened()):
    ret, frame = camera.read()
    if ret:
        fgmask = bs.apply(frame)  # 前景掩码的获取

        th = cv2.threshold(fgmask.copy(), 224, 255, cv2.THRESH_BINARY)[1]  # 阈值得到黑白图
        dilated = cv2.dilate(th, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)),
                             iterations=2)  # 膨胀操作
        contours, hier = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        for c in contours:
            if cv2.contourArea(c) > 1600:  # 用面积来限制显示的识别对象,面积大于1600时画矩形
                (x, y, w, h) = cv2.boundingRect(c)
                cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)

        cv2.imshow('mog', fgmask)
        cv2.imshow('thresh', th)
        cv2.imshow('detection', frame)
    else:
        break
    #    cv2.imshow('frame',fgmask)

    if cv2.waitKey(100) & 0xff == 27:  # ESC退出键的ASCII码是27
        break

camera.release()
cv2.destroyAllWindows()

Cuatro Resumen

Parece funcionar muy mal.

Reconocerá automáticamente objetivos en movimiento, no es necesario usar el mouse para dibujar un objetivo (parece que debido a esto, el efecto es muy pobre)

Supongo que te gusta

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