Obsah:

Sledovanie objektov Opencv: 3 kroky
Sledovanie objektov Opencv: 3 kroky

Video: Sledovanie objektov Opencv: 3 kroky

Video: Sledovanie objektov Opencv: 3 kroky
Video: Роботизированная рука учится имитировать человека с помощью искусственного интеллекта 2024, November
Anonim
Sledovanie objektov Opencv
Sledovanie objektov Opencv

Detekcia pohybujúcich sa predmetov je technika používaná pri počítačovom videní a spracovaní obrazu. Viaceré po sebe idúce snímky z videa sa porovnávajú rôznymi metódami, aby sa určilo, či je detegovaný nejaký pohybujúci sa objekt.

Detekcia pohybujúcich sa predmetov sa používa v celom rade aplikácií, ako je video sledovanie, rozpoznávanie aktivít, monitorovanie stavu vozoviek, bezpečnosť letísk, monitorovanie ochrany pozdĺž morských hraníc atď.

Detekcia pohybujúceho sa objektu je rozpoznať fyzický pohyb objektu v danom mieste alebo oblasti. [2] Účinkujúcou segmentáciou medzi pohybujúcimi sa predmetmi a stacionárnou oblasťou alebo regiónom bolo možné sledovať pohyb pohybujúcich sa objektov, a preto ich možno analyzovať neskôr. Aby sa to dosiahlo, video je štruktúra postavená na jednotlivých snímkach, pričom detekcia pohybujúceho sa objektu má nájsť pohyblivé ciele v popredí, a to buď v každom obrazovom rámci, alebo iba vtedy, keď sa pohybujúci cieľ zobrazí vo videu prvýkrát.

Na detekciu a sledovanie objektov na základe farby použijem kombináciu Opnecv a Python

Krok 1: Nakreslite obdĺžnik na rozpoznaný objekt

Ak váš počítač nemá python alebo opencv, postupujte podľa nižšie uvedených pokynov, ktoré nie je možné nainštalovať

tu je kód pythonu:

import cv2import numpy ako np

cap = cv2. VideoCapture (0)

kým je 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)

(_, kontúry, _) = cv2.findContours (yellow_mask, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

pre kontúry v kontúrach:

area = cv2.contourArea (obrys)

ak (plocha> 800):

x, y, w, h = cv2.boundingRect (obrys) rámec = cv2. obdĺžnik (rám, (x, y), (x+w, y+h), (0, 0, 255), 10)

cv2.imshow („sledovanie“, rámec)

k = cv2.waitKey (5) & 0XFF

ak k == 27: zlom

cv2.destroyAllWindows ()

cap.release ()

Krok 2: Vystopujte cestu, po ktorej sa objekt pohyboval

vystopovať cestu:

pre i v rozsahu (1, len (stredové body)): 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ám, stredové body [i - 1], stredové body , (b, g, r), 4)

Krok 3: Integrácia oboch kódov

Integrujem oba kódy

import cv2import numpy ako np import náhodný zo zbierok import deque

cap = cv2. VideoCapture (1)

# Na sledovanie všetkých miest, kde bol objekt navštívený center_points = deque ()

kým je pravda:

# Prečítajte a prevráťte rámček _, rámček = cap.read () rámček = cv2.flip (rámček, 1)

# Trochu rozmazajte rám

blur_frame = cv2. GaussianBlur (rám, (7, 7), 0)

# Previesť z formátu BGR do formátu HSV

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

# Definujte dolný a horný rozsah farby hsv, ktorú chcete zistiť. Tu modrá

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

# Vytvorte eliptické jadro

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

# Úvodná morfia (erózia s následnou dilatáciou)

maska = cv2.morphologyEx (maska, cv2. MORPH_OPEN, jadro)

# Nájdite všetky kontúry

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

ak je dĺžka (obrysy)> 0:

# Nájdite najväčší obrys najväčší_obrys = max (obrysy, kľúč = cv2.contourArea)

# Nájdite stred obrysu a nakreslite vyplnený kruh

momentu = cv2.momenty (najväčší_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)

# Obrys spojte kruhom

elipsa = cv2.fitEllipse (najväčší_obrys) cv2.ellipse (rám, elipsa, (0, 255, 255), 2)

# Uložte stred obrysu, aby sme mohli nakresliť čiaru, ktorá ho sleduje

center_points.appendleft (centre_of_contour)

# Nakreslite čiaru od stredových bodov obrysu

pre i v rozsahu (1, len (stredové body)): 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ám, stredové body [i - 1], stredové body , (b, g, r), 4)

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

cv2.imshow ('maska', maska)

k = cv2.waitKey (5) & 0xFF

ak k == 27: zlom

cv2.destroyAllWindows ()

cap.release ()

Odporúča: