Obsah:

Sledování objektů Opencv: 3 kroky
Sledování objektů Opencv: 3 kroky

Video: Sledování objektů Opencv: 3 kroky

Video: Sledování objektů Opencv: 3 kroky
Video: Object Identification & Animal Recognition With Raspberry Pi + OpenCV + Python 2024, Listopad
Anonim
Sledování objektů Opencv
Sledování objektů Opencv

Detekce pohybujících se objektů je technika používaná při počítačovém vidění a zpracování obrazu. Několik po sobě jdoucích snímků z videa je porovnáváno různými metodami, aby se určilo, zda je detekován jakýkoli pohybující se objekt.

Detekce pohybujících se předmětů byla použita pro celou řadu aplikací, jako je video dohled, rozpoznávání aktivit, monitorování stavu vozovek, bezpečnost letišť, monitorování ochrany podél mořských hranic atd.

Detekce pohybujícího se objektu je rozpoznat fyzický pohyb objektu v daném místě nebo oblasti. [2] Působením segmentace mezi pohybujícími se objekty a stacionární oblastí nebo oblastí lze pohyb pohybujících se předmětů sledovat a tak je lze analyzovat později. Abyste toho dosáhli, zvažte, že video je struktura postavená na jednotlivých snímcích, detekce pohybujících se objektů má najít pohyblivý cíl (popředí) v popředí, a to buď v každém rámečku videa, nebo pouze tehdy, když pohybující se cíl ukazuje první výskyt ve videu.

K detekci a sledování objektů na základě barvy použiji kombinaci Opnecv a Python

Krok 1: Nakreslení obdélníku na rozpoznaný objekt

Pokud váš počítač nemá python nebo opencv, postupujte podle níže uvedených instrukcí

zde je kód pythonu:

import cv2import numpy jako np

cap = cv2. VideoCapture (0)

zatímco pravda:

_, 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)

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

pro kontury v konturách:

area = cv2.contourArea (obrys)

pokud (plocha> 800):

x, y, w, h = cv2.boundingRect (obrys) rámeček = cv2.rectangle (rámeček, (x, y), (x+w, y+h), (0, 0, 255), 10)

cv2.imshow („sledování“, rámeček)

k = cv2.waitKey (5) & 0XFF

pokud k == 27: break

cv2.destroyAllWindows ()

cap.release ()

Krok 2: Vystopujte cestu, po které se objekt přesunul

trasovat cestu:

pro i v rozsahu (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 (rámeček, středové body [i - 1], středové body , (b, g, r), 4)

Krok 3: Integrace obou kódů

Chystám se integrovat oba kódy

import cv2import numpy jako np import náhodný ze sbírek import deque

cap = cv2. VideoCapture (1)

# Chcete -li sledovat všechny body, kde objekt navštívil center_points = deque ()

zatímco pravda:

# Číst a převracet rámeček _, rámeček = cap.read () rámeček = cv2.flip (rámeček, 1)

# Trochu rozostřete rám

blur_frame = cv2. GaussianBlur (rámeček, (7, 7), 0)

# Převod z barevného formátu BGR na HSV

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

# Definujte dolní a horní rozsah barvy hsv, kterou chcete detekovat. Tady modrá

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

# Vytvořte eliptické jádro

jádro = cv2.getStructuringElement (cv2. MORPH_ELLIPSE, (15, 15))

# Otevírací morf (eroze následovaná dilatací)

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

# Najděte všechny obrysy

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

pokud len (obrysy)> 0:

# Najděte největší obrys největší_obrys = max (obrysy, klíč = cv2.contourArea)

# Najděte střed obrysu a nakreslete vyplněný kruh

momenty = cv2.momenty (největší_obrys) center_of_contour = (int (momenty ['m10'] / momenty ['m00']), int (momenty ['m01'] / momenty ['m00'])) cv2.circle (rám, center_of_contour, 5, (0, 0, 255), -1)

# Ohraničte obrys kruhem

elipsa = cv2.fitEllipse (největší_obrys) cv2.ellipse (rámeček, elipsa, (0, 255, 255), 2)

# Uložte střed obrysu, abychom nakreslili čáru, která jej sleduje

center_points.appendleft (centre_of_contour)

# Nakreslete čáru ze středových bodů obrysu

pro i v rozsahu (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 (rámeček, středové body [i - 1], středové body , (b, g, r), 4)

cv2.imshow ('originál', rám)

cv2.imshow ('maska', maska)

k = cv2.waitKey (5) & 0xFF

pokud k == 27: break

cv2.destroyAllWindows ()

cap.release ()

Doporučuje: