Śledzenie obiektów Opencv: 3 kroki
Śledzenie obiektów Opencv: 3 kroki
Anonim
Śledzenie obiektów Opencv
Śledzenie obiektów Opencv

Wykrywanie poruszających się obiektów to technika stosowana w wizji komputerowej i przetwarzaniu obrazu. Wiele kolejnych klatek z filmu jest porównywanych różnymi metodami w celu określenia, czy wykryto jakikolwiek poruszający się obiekt.

Wykrywanie poruszających się obiektów jest wykorzystywane w szerokim zakresie zastosowań, takich jak nadzór wideo, rozpoznawanie aktywności, monitorowanie stanu dróg, bezpieczeństwo na lotniskach, monitorowanie ochrony wzdłuż granicy morskiej itp.

Wykrywanie poruszającego się obiektu polega na rozpoznaniu fizycznego ruchu obiektu w danym miejscu lub regionie.[2] Działając na segmentację pomiędzy poruszającymi się obiektami a nieruchomym obszarem lub regionem, ruch poruszających się obiektów może być śledzony, a zatem może być później analizowany. Aby to osiągnąć, weź pod uwagę, że wideo jest strukturą zbudowaną z pojedynczych klatek, wykrywanie ruchomych obiektów polega na znalezieniu ruchomego celu na pierwszym planie, w każdej klatce wideo lub tylko wtedy, gdy ruchomy cel pokazuje pierwszy wygląd na wideo.

Zamierzam użyć kombinacji Opnecv i Pythona do wykrywania i śledzenia obiektów na podstawie koloru

Krok 1: Rysowanie prostokąta na rozpoznanym obiekcie

jeśli twój komputer nie ma Pythona lub opencv, postępuj zgodnie z poniższymi instrukcjami

oto kod Pythona:

importuj cv2import numpy jako np

cap = cv2. VideoCapture(0)

podczas gdy prawda:

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

dolny_żółty = np. tablica ([20, 110, 110])

górny_żółty = np. tablica ([40, 255, 255])

żółta_maska = cv2.inRange(hsv, dolna_żółta, górna_żółta)

(_, kontury, _) = cv2.findContours(żółta_maska, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

dla konturu w konturach:

powierzchnia = cv2.contourArea(kontur)

jeśli (obszar > 800):

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

cv2.imshow("śledzenie", ramka)

k = cv2.waitKey(5) i 0XFF

jeśli k == 27: przerwa

cv2.zniszczWszystkieOkna()

cap.zwolnienie()

Krok 2: Wyznacz ścieżkę, po której poruszał się obiekt

aby prześledzić ścieżkę:

dla 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(ramka, center_points[i - 1], center_points, (b, g, r), 4)

Krok 3: Integracja obu kodów

zamierzam zintegrować oba kody

import cv2import numpy as np import random z kolekcji import deque

cap = cv2. VideoCapture(1)

# Aby śledzić wszystkie punkty, w których obiekt odwiedził center_points = deque()

podczas gdy prawda:

# Odczytaj i odwróć ramkę _, ramka = cap.read() frame = cv2.flip(ramka, 1)

# Rozmyj trochę ramkę

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

# Konwertuj z formatu BGR na HSV

hsv = cv2.cvtColor(rozmycie_ramki, cv2. KOLOR_BGR2HSV)

# Zdefiniuj dolny i górny zakres kolorów hsv do wykrycia. Niebieski tutaj

dolny_niebieski = np. tablica([100, 50, 50]) górny_niebieski = np. tablica([140, 255, 255]) maska = cv2.inRange(hsv, dolny_niebieski, górny_niebieski)

# Stwórz jądro eliptyczne

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

# Morf otwarcia (erozja, a następnie rozszerzenie)

maska = cv2.morphologyEx(maska, cv2. MORPH_OPEN, jądro)

# Znajdź wszystkie kontury

kontury, hierarchia = cv2.findContours(maska.copy(), cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE)[-2:]

jeśli len(kontury) > 0:

# Znajdź największy kontur large_contour = max(contours, key=cv2.contourArea)

# Znajdź środek konturu i narysuj wypełniony okrąg

momenty = cv2.moments(największy_kontur) center_of_contour = (int(momenty['m10'] / momenty['m00']), int(momenty['m01'] / momenty['m00'])) cv2.circle(ramka, środek_konturu, 5, (0, 0, 255), -1)

# Związany kontur kółkiem

ellipse = cv2.fitEllipse(biggest_contour) cv2.ellipse(ramka, elipsa, (0, 255, 255), 2)

# Zapisz środek konturu, aby narysować linię śledząc ją

center_points.appendleft(środek_konturu)

# Narysuj linię od środkowych punktów konturu

dla 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(ramka, center_points[i - 1], center_points, (b, g, r), 4)

cv2.imshow('oryginalny', ramka)

cv2.imshow('maska', maska)

k = cv2.waitKey(5) i 0xFF

jeśli k == 27: przerwa

cv2.zniszczWszystkieOkna()

cap.zwolnienie()

Zalecana: