INHOUDSOPGAWE:

Opencv -objekopsporing: 3 stappe
Opencv -objekopsporing: 3 stappe

Video: Opencv -objekopsporing: 3 stappe

Video: Opencv -objekopsporing: 3 stappe
Video: #3. Переменные, оператор присваивания, функции type и id | Python для начинающих 2024, November
Anonim
Opencv -objekopsporing
Opencv -objekopsporing

Bewegingsvoorwerpopsporing is 'n tegniek wat gebruik word in rekenaarvisie en beeldverwerking. Verskeie opeenvolgende rame van 'n video word met verskillende metodes vergelyk om te bepaal of 'n bewegende voorwerp opgespoor word.

Opsporing van bewegende voorwerpe is gebruik vir 'n wye verskeidenheid toepassings, soos video -toesig, aktiwiteitsherkenning, monitering van padtoestande, lughaweveiligheid, monitering van beskerming langs die seegrens, ens.

Bewegingsvoorwerpopsporing is om die fisiese beweging van 'n voorwerp op 'n gegewe plek of gebied te herken. [2] Deur segmentering tussen bewegende voorwerpe en stilstaande gebied of gebied op te tree, kan bewegende voorwerpe se beweging gevolg word en kan dit later geanaliseer word. Om dit te bereik, oorweeg dit dat 'n video 'n struktuur is wat op enkele rame gebou is; opsporing van bewegende voorwerpe is om die bewegende teiken (s) op die voorgrond te vind, hetsy in elke videorame of slegs wanneer die bewegende teiken die eerste verskyning in die video toon.

Ek gaan die kombinasie van Opnecv en Python gebruik om die voorwerpe op grond van die kleur op te spoor en op te spoor

Stap 1: teken 'n reghoek op die erkende voorwerp

As u rekenaar nie python of opencv het nie, volg die onderstaande instruksies hieronder

hier is die python -kode:

voer cv2import numpy in as np

pet = cv2. VideoCapture (0)

terwyl dit waar is:

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

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

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

geel_masker = cv2.inRange (hsv, laer_geel, boonste_geel)

(_, kontoere, _) = cv2.findContours (geel_masker, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

vir kontoer in kontoere:

gebied = cv2.contourArea (kontoer)

as (oppervlakte> 800):

x, y, w, h = cv2.boundingRect (kontoer) raam = cv2.reghoek (raam, (x, y), (x+w, y+h), (0, 0, 255), 10)

cv2.imshow ("dop", raam)

k = cv2.waitKey (5) & 0XFF

as k == 27: breek

cv2.destroyAllWindows ()

cap.release ()

Stap 2: Ontdek die pad waarin die voorwerp beweeg het

om die pad op te spoor:

vir i in reeks (1, len (middelpunte)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) as wiskunde.sqrt (((middelpunte [i - 1] [0] - middelpunte [0]) ** 2) + ((middelpunte [i - 1] [1] - middelpunte [1]) ** 2)) <= 50: cv2.line (raam, middelpunte [i - 1], middelpunte , (b, g, r), 4)

Stap 3: Integreer albei die kodes

Ek gaan albei die kode integreer

invoer cv2import numpy as np invoer ewekansig uit versamelings invoer deque

pet = cv2. VideoCapture (1)

# Om tred te hou met alle punte waar die voorwerp sentrumpunte besoek het = deque ()

terwyl dit waar is:

# Lees en draai raam _, raam = cap.read () raam = cv2.flip (raam, 1)

# Maak die raam 'n bietjie vervaag

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

# Skakel om van BGR na HSV -kleurformaat

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

# Definieer die onderste en boonste reeks hsv -kleur om op te spoor. Blou hier

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

# Maak elliptiese pit

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

# Openingsmorf (erosie gevolg deur verwyding)

masker = cv2.morphologyEx (masker, cv2. MORPH_OPEN, kern)

# Vind alle kontoere

kontoere, hiërargie = cv2.findContours (mask.copy (), cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE) [-2:]

as len (kontoere)> 0:

# Vind die grootste kontoer grootste_kontoer = maksimum (kontoere, sleutel = cv2.contourArea)

# Vind middelpunt van die kontoer en teken 'n gevulde sirkel

oomblikke = cv2.moments (grootste_kontoer) sentrum_van_kontoer = (int (oomblikke ['m10'] / oomblikke ['m00']), int (oomblikke ['m01'] / oomblikke ['m00'])) cv2.circle (raam, sentrum_van_kontoer, 5, (0, 0, 255), -1)

# Omring die kontoer met 'n sirkel

ellips = cv2.fitEllipse (grootste_kontoer) cv2.ellipse (raam, ellips, (0, 255, 255), 2)

# Stoor die middelpunt van die kontoer sodat ons 'n lyn trek om dit te volg

center_points.appendleft (center_of_contour)

# Trek 'n lyn van die middelpunte van die kontoer

vir i in reeks (1, len (middelpunte)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) as wiskunde.sqrt ((((middelpunte [i - 1] [0] - middelpunte [0]) ** 2) + ((middelpunte [i - 1] [1] - middelpunte [1]) ** 2)) <= 50: cv2.line (raam, middelpunte [i - 1], middelpunte , (b, g, r), 4)

cv2.imshow ('oorspronklik', raam)

cv2.imshow ('masker', masker)

k = cv2.waitKey (5) & 0xFF

as k == 27: breek

cv2.destroyAllWindows ()

cap.release ()

Aanbeveel: