Opencv objektide jälgimine: 3 sammu
Opencv objektide jälgimine: 3 sammu
Anonim
Opencv objektide jälgimine
Opencv objektide jälgimine

Liikuva objekti tuvastamine on tehnika, mida kasutatakse arvuti nägemises ja pilditöötluses. Videost võrreldakse mitut järjestikust kaadrit erinevate meetoditega, et teha kindlaks, kas liikuvat objekti tuvastatakse.

Liikuvate objektide tuvastamist on kasutatud paljudes rakendustes, nagu videovalve, tegevuse tuvastamine, teeolukorra jälgimine, lennujaama ohutus, kaitse jälgimine merepiiril jne.

Liikuva objekti tuvastamine on objekti füüsilise liikumise tuvastamine antud kohas või piirkonnas. [2] Liikuvate objektide ja statsionaarse ala või piirkonna vahelise segmenteerimise abil saab liikuvate objektide liikumist jälgida ja seega hiljem analüüsida. Selle saavutamiseks kaaluge, et video on struktuur, mis on üles ehitatud üksikutele kaadritele. Liikuva objekti tuvastamine on esiplaanil oleva liikuva sihtmärgi leidmine kas igas videokaadris või alles siis, kui liikuv sihtmärk näitab videos esimest korda.

Kasutan Opnecvi ja Pythoni kombinatsiooni objektide tuvastamiseks ja jälgimiseks värvi alusel

Samm: ristküliku joonistamine tuvastatud objektile

kui teie arvutis pole pythonit või opencv -d, järgige seda juhendit allpool

siin on püütoni kood:

import cv2import numpy np -na

cap = cv2. VideoCapture (0)

kuigi tõsi:

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

madalam_kollane = np.massiiv ([20, 110, 110])

ülemine_kollane = np.massiiv ([40, 255, 255])

kollane_mask = cv2.inRange (hsv, alumine_kollane, ülemine_kollane)

(_, kontuurid, _) = cv2.findContours (kollane_mask, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

kontuuride jaoks kontuurides:

pindala = cv2.contourArea (kontuur)

kui (pindala> 800):

x, y, w, h = cv2.boundingRect (kontuur) raam = cv2. ristkülik (raam, (x, y), (x+w, y+h), (0, 0, 255), 10)

cv2.imshow ("jälgimine", raam)

k = cv2.waitKey (5) & 0XFF

kui k == 27: murda

cv2.destroyAllWindows ()

cap.release ()

2. samm: jälgige rada, kuhu objekt on liikunud

tee jälgimiseks:

i jaoks vahemikus (1, len (keskpunktid)): b = juhuslik.randint (230, 255) g = juhuslik.randint (100, 255) r = juhuslik.randint (100, 255), kui matemaatika.sqrt ((((keskpunktid [i - 1] [0] - keskpunktid [0]) ** 2) + ((keskpunktid [i - 1] [1] - keskpunktid [1]) ** 2)) <= 50: cv2.line (raam, keskpunktid [i - 1], keskpunktid , (b, g, r), 4)

Samm: mõlema koodi integreerimine

integreerin mõlemad koodid

import cv2import numpy kui np import juhuslik kogudest import deque

cap = cv2. VideoCapture (1)

# Kõigi punktide jälgimiseks, kus objekt külastas, center_points = deque ()

kuigi tõsi:

# Lugege ja pöörake raami _, raam = cap.read () raam = cv2.flip (raam, 1)

# Hägustage raami veidi

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

# Teisenda BGR -st HSV -vormingusse

hsv = cv2.cvtColor (hägusus_raam, cv2. COLOR_BGR2HSV)

# Määratlege tuvastatava hsv -värvi alumine ja ülemine vahemik. Sinine siin

alumine_sinine = np.massiiv ([100, 50, 50]) ülemine_sinine = np.massiiv ([140, 255, 255]) mask = cv2.inRange (hsv, alumine_sinine, ülemine_sinine)

# Tehke elliptiline tuum

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

# Avamorf (erosioon, millele järgneb laienemine)

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

# Leia kõik kontuurid

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

kui len (kontuurid)> 0:

# Leia suurim kontuur suurin_contour = max (kontuurid, võti = cv2.contourArea)

# Leidke kontuuri keskpunkt ja joonistage täidetud ring

hetked = cv2.moments (suurim_kontuur) center_of_contour = (int (hetked ['m10'] / hetked ['m00']), int (hetked ['m01'] / hetked ['m00'])) cv2.circle (frame, kontuuri keskpunkt, 5, (0, 0, 255), -1)

# Siduge kontuur ringiga

ellips = cv2.fit

# Salvestage kontuuri keskpunkt, et saaksime seda jälgida

center_points.appendleft (kontuuri keskpunkt)

# Joonista joon kontuuri keskpunktidest

i jaoks vahemikus (1, len (keskpunktid)): b = juhuslik.randint (230, 255) g = juhuslik.randint (100, 255) r = juhuslik.randint (100, 255), kui matemaatika.sqrt ((((keskpunktid [i - 1] [0] - keskpunktid [0]) ** 2) + ((keskpunktid [i - 1] [1] - keskpunktid [1]) ** 2)) <= 50: cv2.line (raam, keskpunktid [i - 1], keskpunktid , (b, g, r), 4)

cv2.imshow ('originaal', raam)

cv2.imshow ('mask', mask)

k = cv2.waitKey (5) & 0xFF

kui k == 27: murda

cv2.destroyAllWindows ()

cap.release ()

Soovitan: