Tabla de contenido:

Seguimiento de objetos Opencv: 3 pasos
Seguimiento de objetos Opencv: 3 pasos

Video: Seguimiento de objetos Opencv: 3 pasos

Video: Seguimiento de objetos Opencv: 3 pasos
Video: Introducción a seguimiento de objetos con Python-OpenCV 2024, Noviembre
Anonim
Seguimiento de objetos Opencv
Seguimiento de objetos Opencv

La detección de objetos en movimiento es una técnica utilizada en la visión por computadora y el procesamiento de imágenes. Varios fotogramas consecutivos de un video se comparan mediante varios métodos para determinar si se detecta algún objeto en movimiento.

La detección de objetos en movimiento se ha utilizado para una amplia gama de aplicaciones, como videovigilancia, reconocimiento de actividad, monitoreo del estado de la carretera, seguridad aeroportuaria, monitoreo de protección a lo largo de la frontera marítima, etc.

La detección de objetos en movimiento consiste en reconocer el movimiento físico de un objeto en un lugar o región determinados. [2] Al actuar la segmentación entre los objetos en movimiento y el área o región estacionaria, el movimiento de los objetos en movimiento podría rastrearse y, por lo tanto, podría analizarse más tarde. Para lograr esto, considere que un video es una estructura construida sobre cuadros individuales, la detección de objetos en movimiento es encontrar el objetivo en movimiento en primer plano, ya sea en cada cuadro de video o solo cuando el objetivo en movimiento muestra la primera aparición en el video.

Voy a usar la combinación de Opnecv y Python para detectar y rastrear los objetos según el color.

Paso 1: dibujar un rectángulo en el objeto reconocido

si su pc no tiene python o opencv, siga los siguientes instructivos

aquí está el código de Python:

importar cv2importar numpy como np

cap = cv2. VideoCapture (0)

mientras que es cierto:

_, marco = cap.read () hsv = cv2.cvtColor (marco, cv2. COLOR_BGR2HSV)

lower_yellow = np.array ([20, 110, 110])

Upper_yellow = np.array ([40, 255, 255])

yellow_mask = cv2.inRange (hsv, lower_yellow, upper_yellow)

(_, contornos, _) = cv2.findContours (máscara_amarilla, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

para contorno en contornos:

area = cv2.contourArea (contorno)

si (área> 800):

x, y, w, h = cv2.boundingRect (contorno) frame = cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 0, 255), 10)

cv2.imshow ("seguimiento", marco)

k = cv2.waitKey (5) y 0XFF

si k == 27: romper

cv2.destroyAllWindows ()

cap.release ()

Paso 2: trace la ruta en la que se movió el objeto

para rastrear el camino:

para i en el rango (1, len (center_points)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) if math.sqrt (((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (marco, center_points [i - 1], center_points , (b, g, r), 4)

Paso 3: Integrar ambos códigos

voy a integrar tanto el código

importar cv2importar numpy as np importar aleatoriamente de colecciones importar deque

cap = cv2. VideoCapture (1)

# Para realizar un seguimiento de todos los puntos donde el objeto visitó center_points = deque ()

mientras que es cierto:

# Leer y voltear marco _, marco = cap.read () marco = cv2.flip (marco, 1)

# Difumina un poco el encuadre

blur_frame = cv2. GaussianBlur (marco, (7, 7), 0)

# Convertir de formato de color BGR a HSV

hsv = cv2.cvtColor (fotograma_desenfocado, cv2. COLOR_BGR2HSV)

# Defina el rango superior e inferior del color hsv a detectar. Azul aquí

lower_blue = np.array ([100, 50, 50]) upper_blue = np.array ([140, 255, 255]) mask = cv2.inRange (hsv, lower_blue, upper_blue)

# Hacer kernel elíptico

kernel = cv2.getStructuringElement (cv2. MORPH_ELLIPSE, (15, 15))

# Morfo de apertura (erosión seguida de dilatación)

máscara = cv2.morphologyEx (máscara, cv2. MORPH_OPEN, kernel)

# Encuentra todos los contornos

contornos, jerarquía = cv2.findContours (mask.copy (), cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE) [- 2:]

si len (contornos)> 0:

# Encuentra el contorno más grande Big_contour = max (contours, key = cv2.contourArea)

# Encuentra el centro del contorno y dibuja un círculo relleno

momentos = cv2.moments (mayor_contour) centre_of_contour = (int (momentos ['m10'] / momentos ['m00']), int (momentos ['m01'] / momentos ['m00'])) cv2.circle (marco, centro_de_contour, 5, (0, 0, 255), -1)

# Delimita el contorno con un círculo

elipse = cv2.fitEllipse (mayor_contour) cv2.ellipse (marco, elipse, (0, 255, 255), 2)

# Guarde el centro del contorno para que dibujemos la línea siguiéndolo

center_points.appendleft (centre_of_contour)

# Dibujar una línea desde los puntos centrales del contorno

para i en el rango (1, len (center_points)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) if math.sqrt (((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (marco, center_points [i - 1], center_points , (b, g, r), 4)

cv2.imshow ('original', marco)

cv2.imshow ('máscara', máscara)

k = cv2.waitKey (5) y 0xFF

si k == 27: romper

cv2.destroyAllWindows ()

cap.release ()

Recomendado: