Inhaltsverzeichnis:

Opencv-Objektverfolgung - Gunook
Opencv-Objektverfolgung - Gunook

Video: Opencv-Objektverfolgung - Gunook

Video: Opencv-Objektverfolgung - Gunook
Video: Real Time Football Player and Ball Detection and Tracking using YOLOv8 Live :Object Tracking YOLOv8 2024, November
Anonim
Opencv-Objektverfolgung
Opencv-Objektverfolgung

Die Erkennung beweglicher Objekte ist eine Technik, die in der Computer Vision und Bildverarbeitung verwendet wird. Mehrere aufeinanderfolgende Frames aus einem Video werden durch verschiedene Verfahren verglichen, um zu bestimmen, ob ein sich bewegendes Objekt erkannt wird.

Die Erkennung sich bewegender Objekte wurde für eine Vielzahl von Anwendungen wie Videoüberwachung, Aktivitätserkennung, Straßenzustandsüberwachung, Flughafensicherheit, Überwachung des Schutzes entlang der Meeresgrenze usw. verwendet.

Die Erkennung sich bewegender Objekte besteht darin, die physische Bewegung eines Objekts an einem bestimmten Ort oder in einer bestimmten Region zu erkennen.[2] Durch eine Segmentierung zwischen sich bewegenden Objekten und einem stationären Bereich oder Bereich könnte die Bewegung der sich bewegenden Objekte verfolgt und somit später analysiert werden. Um dies zu erreichen, stellen Sie sich vor, dass ein Video eine Struktur ist, die auf Einzelbildern aufgebaut ist. Die Erkennung von bewegten Objekten besteht darin, das (die) sich bewegende(n) Ziel(e) im Vordergrund zu finden, entweder in jedem Videobild oder nur, wenn das sich bewegende Ziel das erste Erscheinen im Video zeigt.

Ich werde die Opnecv- und Python-Kombination verwenden, um die Objekte basierend auf der Farbe zu erkennen und zu verfolgen

Schritt 1: Zeichnen eines Rechtecks auf dem erkannten Objekt

Wenn Ihr PC kein Python oder Opencv hat, folgen Sie bitte diesen Anweisungen unten

hier ist der Python-Code:

import cv2import numpy als np

cap = cv2. VideoCapture(0)

während Wahr:

_, frame = cap.read() hsv = cv2.cvtColor(frame, 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)

(_, Konturen, _) = cv2.findContours(yellow_mask, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

für Kontur in Konturen:

Bereich = cv2.contourArea(Kontur)

wenn(Fläche > 800):

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

cv2.imshow("Tracking", Frame)

k = cv2.waitKey(5) & 0XFF

wenn k == 27: Pause

cv2.destroyAllWindows()

cap.release()

Schritt 2: Verfolgen Sie den Pfad, in dem sich das Objekt bewegt hat

um den Weg zu verfolgen:

für i in range(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(frame, center_points[i - 1], center_points, (b, g, r), 4)

Schritt 3: Beide Codes integrieren

Ich werde die beiden Codes integrieren

import cv2import numpy as np import random from collections import deque

cap = cv2. VideoCapture(1)

# Um alle Punkte zu verfolgen, an denen das Objekt besucht wurde center_points = deque()

während Wahr:

# Frame _ lesen und spiegeln, frame = cap.read() frame = cv2.flip(frame, 1)

# Verwische den Rahmen ein wenig

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

# Konvertieren vom BGR- in das HSV-Farbformat

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

# Definieren Sie den unteren und oberen Bereich der zu erkennenden HSV-Farbe. Blau hier

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

# Erstelle einen elliptischen Kernel

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

# Eröffnungsmorph (Erosion gefolgt von Dilatation)

mask = cv2.morphologyEx(Maske, cv2. MORPH_OPEN, Kernel)

# Finde alle Konturen

Konturen, Hierarchie = cv2.findContours(mask.copy(), cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE)[-2:]

if len(Konturen) > 0:

# Finde die größte Kontur maximum_contour = max(contours, key=cv2.contourArea)

# Konturmitte finden und gefüllten Kreis zeichnen

momente = cv2.moments(biggest_contour) center_of_contour = (int(moments['m10'] / momente['m00']), int(moments['m01'] / momente['m00'])) cv2.circle(frame, center_of_contour, 5, (0, 0, 255), -1)

# Umranden Sie die Kontur mit einem Kreis

Ellipse = cv2.fitEllipse(biggest_contour) cv2.ellipse(Rahmen, Ellipse, (0, 255, 255), 2)

# Speichern Sie die Mitte der Kontur, damit wir eine Linie zeichnen, die sie verfolgt

center_points.appendleft(centre_of_contour)

# Linie von Mittelpunkten der Kontur zeichnen

für i in range(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(frame, center_points[i - 1], center_points, (b, g, r), 4)

cv2.imshow('Original', Rahmen)

cv2.imshow('Maske', Maske)

k = cv2.waitKey(5) & 0xFF

wenn k == 27: Pause

cv2.destroyAllWindows()

cap.release()