Sadržaj:

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

Detekcija pokretnih objekata tehnika je koja se koristi u računarskom 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, praćenje stanja na cestama, sigurnost aerodroma, nadzor zaštite uz morsku granicu itd.

Otkrivanje pokretnih objekata je prepoznavanje fizičkog kretanja 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, uzmite u obzir da je video struktura izgrađena na pojedinačnim kadrovima, otkrivanje pokretnih objekata je da se pronađu pokretni (i) ciljevi (i) u prvom planu, bilo u svakom video kadru ili samo kada se pokretni cilj prikaže prvi put u videu.

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

Korak 1: Nacrtajte pravokutnik na prepoznatom objektu

ako vaš računar nema python ili opencv, slijedite ove upute ispod

evo python koda:

import cv2import numpy kao np

cap = cv2. VideoCapture (0)

dok je True:

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

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

gornja_žuta = np. matrica ([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) frame = cv2.rectangle (okvir, (x, y), (x+w, y+h), (0, 0, 255), 10)

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

k = cv2.waitKey (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 tačke)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) if math.sqrt ((((središnje_tačke [i - 1] [0] - središnje_tačke [0]) ** 2) + ((središnje_tačke [i - 1] [1] - središnje_tačke [1]) ** 2)) <= 50: cv2.line (okvir, središnje_tačke [i - 1], središnje_tačke , (b, g, r), 4)

Korak 3: Integriranje oba koda

Ja ću integrirati oba koda

import cv2import numpy kao np import random from collection deque import

cap = cv2. VideoCapture (1)

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

dok je True:

# 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.cvtColor (blur_frame, cv2. COLOR_BGR2HSV)

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

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

# Napravite eliptično jezgro

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

# Morph otvaranja (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']), 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)

# Sačuvajte središte konture kako bismo povukli liniju koja je prati

center_points.appendleft (centre_of_contour)

# Nacrtajte liniju od središnjih tačaka konture

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

cv2.imshow ('original', okvir)

cv2.imshow ('maska', maska)

k = cv2.waitKey (5) & 0xFF

ako je k == 27: prekid

cv2.destroyAllWindows ()

cap.release ()

Preporučuje se: