Opencv -objektin seuranta: 3 vaihetta
Opencv -objektin seuranta: 3 vaihetta
Anonim
Opencv -objektien seuranta
Opencv -objektien seuranta

Liikkuvien kohteiden tunnistus on tekniikka, jota käytetään tietokoneen näkemisessä ja kuvankäsittelyssä. Videon useita peräkkäisiä ruutuja verrataan eri menetelmillä sen määrittämiseksi, havaitaanko liikkuva kohde.

Liikkuvien kohteiden havaitsemista on käytetty monenlaisiin sovelluksiin, kuten videovalvontaan, toiminnan tunnistamiseen, tien kunnon seurantaan, lentoasemien turvallisuuteen, suojelun seurantaan meren rajalla jne.

Liikkuvan kohteen havaitseminen tunnistaa kohteen fyysisen liikkeen tietyssä paikassa tai alueella. [2] Toimimalla segmentoimalla liikkuvien kohteiden ja paikallaan olevan alueen tai alueen välillä liikkuvien kohteiden liike voitaisiin seurata ja siten analysoida myöhemmin. Tämän saavuttamiseksi katsokaa, että video on yksittäisiin kehyksiin rakennettu rakenne. Liikkuvan kohteen havaitseminen on löytää etualan liikkuva kohde joko kustakin videokehyksestä tai vasta, kun liikkuva kohde näyttää videossa ensimmäisen kerran.

Aion käyttää Opnecv- ja Python -yhdistelmää esineiden havaitsemiseen ja seurantaan värin perusteella

Vaihe 1: Suorakulmion piirtäminen tunnistettuun kohteeseen

jos tietokoneessasi ei ole pythonia tai opencv: tä, noudata alla olevia ohjeita

tässä python -koodi:

tuo cv2import numpy np: nä

cap = cv2. VideoCapture (0)

vaikka totta:

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

alempi_keltainen = np.array ([20, 110, 110])

ylempi_keltainen = np.array ([40, 255, 255])

keltainen_maski = cv2.inRange (hsv, alempi_keltainen, ylempi_keltainen)

(_, ääriviivat, _) = cv2.findContours (keltainen_maski, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

ääriviivojen ääriviivat:

pinta -ala = cv2.contourArea (muoto)

jos (alue> 800):

x, y, w, h = cv2.boundingSuora (ääriviiva) -kehys = cv2.suorakulmio (kehys, (x, y), (x+w, y+h), (0, 0, 255), 10)

cv2.imshow ("seuranta", kehys)

k = cv2.waitKey (5) & 0XFF

jos k == 27: tauko

cv2.destroyAllWindows ()

cap.release ()

Vaihe 2: Jäljitä polku, johon kohde on siirtynyt

polun jäljittämiseksi:

i: lle alueella (1, len (keskipisteet)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) if math.sqrt ((((keskipisteet [i - 1] [0] - keskipisteet [0]) ** 2) + ((keskipisteet [i - 1] [1] - keskipisteet [1]) ** 2)) <= 50: cv2.line (kehys, keskipisteet [i - 1], keskipisteet , (b, g, r), 4)

Vaihe 3: Molempien koodien integrointi

aion yhdistää molemmat koodit

Tuo cv2import numpy np: nä tuonti satunnaisesti kokoelmista tuonti deque

cap = cv2. VideoCapture (1)

# Seurata kaikkia pisteitä, joissa kohde vieraili center_points = deque ()

vaikka totta:

# Lue ja käännä kehys _, frame = cap.read () runko = cv2.flip (kehys, 1)

# Hämärtää kehystä hieman

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

# Muunna BGR: stä HSV -värimuotoon

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

# Määritä havaittavan hsv -värin alempi ja ylempi alue. Sininen täällä

alempi_sininen = np.array ([100, 50, 50]) ylä_sininen = np.array ([140, 255, 255]) maski = cv2.inRange (hsv, alempi_sininen, ylempi_sininen)

# Tee elliptinen ydin

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

# Avausmorfia (eroosio, jota seuraa laajentuminen)

mask = cv2.morphologyEx (maski, cv2. MORPH_OPEN, ydin)

# Etsi kaikki ääriviivat

ääriviivat, hierarkia = cv2.findContours (mask.copy (), cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE) [-2:]

jos len (ääriviivat)> 0:

# Etsi suurin ääriviiva suurin_muoto = max (ääriviivat, avain = cv2.contourArea)

# Etsi muodon keskipiste ja piirrä täytetty ympyrä

hetket = cv2.moments (suurin_kontuuri) center_of_contour = (int (hetkiä ['m10'] / hetkiä ['m00']), int (hetkiä ['m01'] / hetkiä ['m00'])) cv2.circle (frame, muodon keskipiste, 5, (0, 0, 255), -1)

# Sido ääriviivat ympyrällä

ellipsi = cv2.fit

# Tallenna muodon keskipiste, jotta voimme piirtää viivan sen seurantaa varten

center_points.appendleft (muodon keskipiste)

# Piirrä viiva muodon keskipisteistä

i: lle alueella (1, len (keskipisteet)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) if math.sqrt ((((keskipisteet [i - 1] [0] - keskipisteet [0]) ** 2) + ((keskipisteet [i - 1] [1] - keskipisteet [1]) ** 2)) <= 50: cv2.line (kehys, keskipisteet [i - 1], keskipisteet , (b, g, r), 4)

cv2.imshow ('alkuperäinen', kehys)

cv2.imshow ('naamio', naamio)

k = cv2.waitKey (5) & 0xFF

jos k == 27: tauko

cv2.destroyAllWindows ()

cap.release ()

Suositeltava: