Sadržaj:

Praćenje objekata Opencv: 3 koraka
Praćenje objekata Opencv: 3 koraka

Video: Praćenje objekata Opencv: 3 koraka

Video: Praćenje objekata Opencv: 3 koraka
Video: Leap Motion SDK 2024, Studeni
Anonim
Praćenje objekata Opencv
Praćenje objekata Opencv

Otkrivanje pokretnih objekata tehnika je koja se koristi u računalnom vidu i obradi slike. Više uzastopnih kadrova iz videozapisa uspoređuje se različitim metodama kako bi se utvrdilo je li otkriven neki pokretni objekt.

Otkrivanje pokretnih objekata koristilo se za širok raspon primjena kao što su video nadzor, prepoznavanje aktivnosti, nadzor stanja cesta, sigurnost zračnih luka, nadzor zaštite uz morsku granicu itd.

Otkrivanje pokretnih objekata prepoznaje fizičko kretanje objekta na određenom mjestu ili području. [2] Djelovanjem segmentacije među pokretnim objektima i stacionarnim područjem ili regijom, kretanje pokretnih objekata moglo bi se pratiti i na taj način kasnije analizirati. Da biste to postigli, smatrajte da je video struktura izgrađena na pojedinačnim kadrovima. Otkrivanje pokretnih objekata je pronalaženje pokretnih ciljeva u prvom planu, bilo u svakom video kadru, bilo samo kada se pokretni cilj prikazuje prvi put u videu.

Koristit ću Opnecv i Python kombinaciju za otkrivanje i praćenje objekata na temelju boje

Korak 1: Nacrtajte pravokutnik na prepoznatom objektu

ako vaše računalo nema python ili opencv, slijedite upute u nastavku

evo python koda:

uvoz cv2import numpy kao np

cap = cv2. VideoCapture (0)

dok je istina:

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

donji_žuti = np.mat ([20, 110, 110])

gornja_žuta = np.mat ([40, 255, 255])

žuta_maska = cv2.inRange (hsv, donji_žuti, gornji_žuti)

(_, konture, _) = cv2.findContours (žuta_maska, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

za konture u konturama:

area = cv2.contourArea (kontura)

ako (područje> 800):

x, y, w, h = cv2.boundingRect (kontura) okvir = cv2.pravokutnik (okvir, (x, y), (x+w, y+h), (0, 0, 255), 10)

cv2.imshow ("praćenje", okvir)

k = cv2.čekajteKljuč (5) & 0XFF

ako je k == 27: prekid

cv2.destroyAllWindows ()

cap.release ()

Korak 2: Nacrtajte putanju na kojoj se objekt premjestio

za praćenje putanje:

za i u rasponu (1, len (središnje točke)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) if math.sqrt ((((središnje_točke [i - 1] [0] - središnje_točke [0]) ** 2) + ((središnje_točke [i - 1] [1] - središnje_točke [1]) ** 2)) <= 50: cv2.line (okvir, središnje_točke [i - 1], središnje_točke , (b, g, r), 4)

Korak 3: Integriranje oba koda

Idem integrirati oba koda

import cv2import numpy kao np uvoz random iz zbirki deque uvoz

cap = cv2. VideoCapture (1)

# Za praćenje svih točaka gdje je objekt posjetio center_points = deque ()

dok je istina:

# Očitavanje i okretanje okvira _, okvir = cap.read () okvir = cv2.flip (okvir, 1)

# Malo zamaglite okvir

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

# Pretvorite iz BGR u HSV format boje

hsv = cv2.cvtBoja (okvir zamućenja, cv2. COLOR_BGR2HSV)

# Definirajte donji i gornji raspon hsv boje za otkrivanje. Ovdje plavo

donje_plavo = np.mat ([100, 50, 50]) gornje_plavo = np.polje ([140, 255, 255]) maska = cv2.inRange (hsv, donje_plavo, gornje_plavo)

# Napravite eliptično jezgro

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

# Otvaranje (erozija praćena širenjem)

mask = cv2.morphologyEx (maska, cv2. MORPH_OPEN, kernel)

# Pronađite sve konture

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

ako je len (konture)> 0:

# Pronađite najveću konturu najveća_kontura = max (konture, ključ = cv2.contourArea)

# Pronađite središte konture i nacrtajte ispunjeni krug

trenuci = cv2.momenti (najveći_kontur) centar_konture = (int (trenuci ['m10'] / momenti ['m00']), int (trenuci ['m01'] / momenti ['m00'])) cv2.circle (okvir, centar_konture, 5, (0, 0, 255), -1)

# Povežite konturu s krugom

elipsa = cv2.fitElipsa (najveći_kontura) cv2.ellipse (okvir, elipsa, (0, 255, 255), 2)

# Spremite središte konture tako da povučemo liniju koja je prati

center_points.appendleft (centre_of_contour)

# Nacrtajte liniju od središnjih točaka konture

za i u rasponu (1, len (središnje_točke)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) if math.sqrt ((((središnje_točke [i - 1] [0] - središnje_točke [0]) ** 2) + ((središnje_točke [i - 1] [1] - središnje_točke [1]) ** 2)) <= 50: cv2.line (okvir, središnje_točke [i - 1], središnje_točke , (b, g, r), 4)

cv2.imshow ('izvornik', okvir)

cv2.imshow ('maska', maska)

k = cv2.čekajteKljuč (5) & 0xFF

ako je k == 27: prekid

cv2.destroyAllWindows ()

cap.release ()

Preporučeni: