Inhaltsverzeichnis:
- Schritt 1: Zeichnen eines Rechtecks auf dem erkannten Objekt
- Schritt 2: Verfolgen Sie den Pfad, in dem sich das Objekt bewegt hat
- Schritt 3: Beide Codes integrieren
Video: Opencv-Objektverfolgung - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:16
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()