Sledenje objektom Opencv: 3 koraki
Sledenje objektom Opencv: 3 koraki
Anonim
Sledenje objektom Opencv
Sledenje objektom Opencv

Odkrivanje premikajočih se predmetov je tehnika, ki se uporablja pri računalniškem vidu in obdelavi slik. Več zaporednih sličic iz videoposnetka se z različnimi metodami primerja, da se ugotovi, ali je zaznan premikajoč se predmet.

Odkrivanje premikajočih se predmetov je bilo uporabljeno za široko paleto aplikacij, kot so video nadzor, prepoznavanje dejavnosti, spremljanje stanja cest, varnost letališč, spremljanje zaščite ob morski meji itd.

Odkrivanje premikajočega se predmeta je prepoznavanje fizičnega gibanja predmeta na določenem mestu ali območju. [2] Z segmentacijo med premikajočimi se predmeti in stacionarnim območjem ali regijo je mogoče slediti gibanju premikajočih se predmetov in jih je kasneje mogoče analizirati. Da bi to dosegli, upoštevajte, da je video struktura, zgrajena na posameznih sličicah, odkrivanje premikajočih se objektov pa je iskanje premikajočih se ciljev v ospredju, bodisi v vsakem kadru videoposnetka bodisi le, ko premikajoči se cilj prikaže prvi videz v videoposnetku.

Uporabil bom kombinacijo Opnecv in Python za odkrivanje in sledenje predmetom glede na barvo

1. korak: Narišite pravokotnik na prepoznanem objektu

če vaš računalnik nima python ali opencv, sledite spodnjim navodilom

tukaj je koda python:

uvoz cv2import numpy kot np

cap = cv2. VideoCapture (0)

medtem ko je res:

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

spodnja_rumena = np. matrika ([20, 110, 110])

zgornja_rumena = matrika np ([40, 255, 255])

rumena_maska = cv2.inRange (hsv, spodnja_rumena, zgornja_rumena)

(_, konture, _) = cv2.findContours (rumena_maska, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

za konture v obrisih:

area = cv2.contourArea (kontura)

če (območje> 800):

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

cv2.imshow ("sledenje", okvir)

k = cv2.počakajKljuč (5) & 0XFF

če je k == 27: prelom

cv2.destroyAllWindows ()

cap.release ()

2. korak: Izsledite pot, po kateri se je predmet premaknil

za sledenje poti:

za i v razponu (1, len (središčne točke)): b = naključni.randint (230, 255) g = naključni.randint (100, 255) r = naključni.randint (100, 255), če je math.sqrt ((((središčne točke [i - 1] [0] - središčne točke [0]) ** 2) + ((središčne točke [i - 1] [1] - središčne točke [1]) ** 2)) <= 50: cv2.line (okvir, središčne_točke [i - 1], središčne_točke , (b, g, r), 4)

3. korak: Integracija obeh kod

obe kodi bom integriral

uvoz cv2import numpy kot np uvoz naključno iz zbirk za uvoz uvoz

cap = cv2. VideoCapture (1)

# Za spremljanje vseh točk, kjer je bil predmet obiskan center_points = deque ()

medtem ko je res:

# Preberi in obrni okvir _, okvir = cap.read () okvir = cv2.flip (okvir, 1)

# Malo zameglite okvir

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

# Pretvorite iz barvnega formata BGR v HSV

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

# Določite spodnje in zgornje območje barve hsv za zaznavanje. Tukaj modra

spodnja_modra = np. matrika ([100, 50, 50]) zgornja_modra = np. matrika ([140, 255, 255]) maska = cv2.inRange (hsv, spodnja_plava, zgornja_modra)

# Naredite eliptično jedro

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

# Odpiranje morfa (erozija, ki ji sledi širjenje)

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

# Poiščite vse obrise

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

če je len (konture)> 0:

# Poiščite največjo konturo največji_kontur = max (konture, ključ = cv2.contourArea)

# Poiščite središče konture in narišite zapolnjen krog

trenutki = cv2.momenti (največji_kontur) center_konture = (int (trenutki ['m10'] / trenutki ['m00']), int (trenutki ['m01'] / trenutki ['m00']) cv2.krog (okvir, center_konture, 5, (0, 0, 255), -1)

# Obkrožite konturo s krogom

elipse = cv2.fitEllipse (največja_kontura) cv2.ellipse (okvir, elipsa, (0, 255, 255), 2)

# Shranite središče konture, da narišemo črto, ki ji sledi

center_points.appendleft (centre_of_contour)

# Narišite črto iz osrednjih točk konture

za i v razponu (1, len (središčne točke)): b = naključni.randint (230, 255) g = naključni.randint (100, 255) r = naključni.randint (100, 255), če je math.sqrt ((((središčne točke [i - 1] [0] - središčne točke [0]) ** 2) + ((središčne točke [i - 1] [1] - središčne točke [1]) ** 2)) <= 50: cv2.line (okvir, središčne_točke [i - 1], središčne_točke , (b, g, r), 4)

cv2.imshow ('original', okvir)

cv2.imshow ('maska', maska)

k = cv2.počakajKljuč (5) & 0xFF

če je k == 27: prelom

cv2.destroyAllWindows ()

cap.release ()

Priporočena: