Turinys:

„Opencv“objektų stebėjimas: 3 žingsniai
„Opencv“objektų stebėjimas: 3 žingsniai

Video: „Opencv“objektų stebėjimas: 3 žingsniai

Video: „Opencv“objektų stebėjimas: 3 žingsniai
Video: Identification of Driver Phone Usage Violations via State-of-the-Art Object Detection with Tracking 2024, Lapkritis
Anonim
„Opencv“objektų stebėjimas
„Opencv“objektų stebėjimas

Judančių objektų aptikimas yra technika, naudojama kompiuteriniam matymui ir vaizdo apdorojimui. Keli vaizdo įrašo kadrai iš eilės palyginami įvairiais metodais, kad būtų galima nustatyti, ar aptinkamas judantis objektas.

Judančių objektų aptikimas buvo naudojamas įvairioms programoms, tokioms kaip vaizdo stebėjimas, veiklos atpažinimas, kelių būklės stebėjimas, oro uostų sauga, apsaugos prie jūros stebėjimas ir kt.

Judančių objektų aptikimas yra atpažinti fizinį objekto judėjimą tam tikroje vietoje ar regione. [2] Veikiant segmentus tarp judančių objektų ir nejudančios srities ar srities, judančių objektų judėjimas gali būti stebimas ir taip vėliau gali būti analizuojamas. Norėdami tai pasiekti, apsvarstykite, ar vaizdo įrašas yra struktūra, sudaryta iš atskirų kadrų, o judančio objekto aptikimas yra surasti priekinį planą (-us) judantį (-us) taikinį (-us) kiekviename vaizdo įrašo kadre arba tik tada, kai judantis taikinys pirmą kartą pasirodo vaizdo įraše.

Aš ketinu naudoti „Opnecv“ir „Python“derinį objektams aptikti ir sekti pagal spalvą

1 žingsnis: Nubrėžkite stačiakampį ant atpažinto objekto

jei jūsų kompiuteryje nėra „python“ar „opencv“, vadovaukitės toliau pateiktomis instrukcijomis

čia yra python kodas:

importuoti cv2import numpy kaip np

cap = cv2. VideoCapture (0)

nors tiesa:

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

apatinis_ geltonas = np.masyvas ([20, 110, 110])

viršutinė_ geltona = np.masyvas ([40, 255, 255])

geltona_kaukė = cv2.inRange (hsv, apatinė_ geltona, viršutinė_ geltona)

[_, kontūrai, _] = cv2.findContours (geltona_kaukė, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

kontūrui kontūruose:

plotas = cv2.contourArea (kontūras)

jei (plotas> 800):

x, y, w, h = cv2.boundingRect (kontūro) rėmas = cv2. stačiakampis (frame, (x, y), (x+w, y+h), (0, 0, 255), 10)

cv2.imshow („stebėjimas“, kadras)

k = cv2.waitKey (5) ir 0XFF

jei k == 27: pertrauka

cv2.destroyAllWindows ()

cap.release ()

2 žingsnis: atsekite kelią, kuriuo judėjo objektas

sekti kelią:

i diapazone (1, len (centro_taškai)): b = atsitiktinis.randint (230, 255) g = atsitiktinis.randint (100, 255) r = atsitiktinis.randint (100, 255), jei math.sqrt ((((centro taškai [i - 1] [0] - centro taškai [0]) ** 2) + ((centro taškai [i - 1] [1] - centro taškai [1]) ** 2)) <= 50: cv2.line (kadras, centro taškai [i - 1], centro taškai , (b, g, r), 4)

3 žingsnis: abiejų kodų integravimas

Aš integruosiu abu kodus

importuoti cv2import numpy kaip np importuoti atsitiktinai iš kolekcijų importuoti deque

cap = cv2. VideoCapture (1)

# Norėdami sekti visus taškus, kuriuose lankėsi objektas center_points = deque ()

nors tiesa:

# Skaitykite ir apverskite rėmelį _, rėmas = dangtelis. (Rėmas = cv2.flip (rėmas, 1)

# Šiek tiek neryškinkite rėmelį

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

# Konvertuokite iš BGR į HSV spalvų formatą

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

# Apibrėžkite apatinį ir viršutinį hsv spalvų diapazoną. Mėlyna čia

apatinė_ mėlyna = np.masyvas ([100, 50, 50]) viršutinė_ mėlyna = np.masyvas ([140, 255, 255]) kaukė = cv2.inRange (hsv, apatinė_ mėlyna, viršutinė_ mėlyna)

# Padarykite elipsinį branduolį

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

# Pradinis morfas (erozija, po kurios išsiplėtimas)

kaukė = cv2.morphologyEx (kaukė, cv2. MORPH_OPEN, branduolys)

# Raskite visus kontūrus

kontūrai, hierarchija = cv2.findContours (mask.copy (), cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE) [-2:]

jei len (kontūrai)> 0:

# Raskite didžiausią kontūrą didžiausias_kontoras = maks. (Kontūrai, raktas = cv2.contourArea)

# Raskite kontūro centrą ir nubrėžkite užpildytą apskritimą

momentai = cv2.moments (didžiausias_kontūras) centre_of_contour = (int (akimirkos ['m10'] / akimirkos ['m00']), int (akimirkos ['m01'] / akimirkos ['m00'])) cv2.circle (frame, kontūro centras, 5, (0, 0, 255), -1)

# Apriškite kontūrą apskritimu

elipsė = cv2.fit

# Išsaugokite kontūro centrą, kad nubrėžtume jo sekimo liniją

center_points.appendleft (centre_kontūro)

# Nubrėžkite liniją nuo centrinių kontūro taškų

i diapazone (1, len (centro_taškai)): b = atsitiktinis.randint (230, 255) g = atsitiktinis.randint (100, 255) r = atsitiktinis.randint (100, 255), jei math.sqrt ((((centro taškai [i - 1] [0] - centro taškai [0]) ** 2) + ((centro taškai [i - 1] [1] - centro taškai [1]) ** 2)) <= 50: cv2.line (kadras, centro taškai [i - 1], centro taškai , (b, g, r), 4)

cv2.imshow ('originalus', kadras)

cv2.imshow ('kaukė', kaukė)

k = cv2.waitKey (5) ir 0xFF

jei k == 27: pertrauka

cv2.destroyAllWindows ()

cap.release ()

Rekomenduojamas: