Opencv objektu izsekošana: 3 soļi
Opencv objektu izsekošana: 3 soļi
Anonim
Opencv objektu izsekošana
Opencv objektu izsekošana

Kustīgu objektu noteikšana ir metode, ko izmanto datora redzējumā un attēlu apstrādē. Vairāki secīgi video kadri tiek salīdzināti ar dažādām metodēm, lai noteiktu, vai tiek atklāts kustīgs objekts.

Kustīgu objektu noteikšana ir izmantota plašam lietojumu klāstam, piemēram, videonovērošanai, darbību atpazīšanai, ceļu stāvokļa uzraudzībai, lidostu drošībai, aizsardzības uzraudzībai gar jūras robežu utt.

Kustīgu objektu noteikšana ir atpazīt objekta fizisko kustību noteiktā vietā vai reģionā. [2] Veicot segmentāciju starp kustīgiem objektiem un stacionāru zonu vai reģionu, kustīgo objektu kustību varētu izsekot un tādējādi to varētu analizēt vēlāk. Lai to panāktu, uzskatiet, ka videoklips ir struktūra, kas veidota uz atsevišķiem kadriem, un kustīgu objektu noteikšana ir atrast priekšplāna kustīgo (-os) mērķi (-us) vai nu katrā video kadrā, vai tikai tad, kad kustīgais mērķis parāda pirmo videoklipa izskatu.

Es izmantošu Opnecv un Python kombināciju, lai noteiktu un izsekotu objektus, pamatojoties uz krāsu

1. darbība. Taisnstūra uzzīmēšana uz atpazīstamā objekta

ja jūsu datoram nav python vai opencv, lūdzu, ievērojiet tālāk sniegtos norādījumus

šeit ir pitona kods:

importēt cv2import numpy kā np

cap = cv2. VideoCapture (0)

kamēr taisnība:

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

apakšējais_dzeltens = np.masīvs ([20, 110, 110])

augšējais_dzeltens = np.masīvs ([40, 255, 255])

dzeltena_maska = cv2.inRange (HSV, apakšējā_dzeltenā, augšējā_dzeltenā)

(_, kontūras, _) = cv2.findContours (dzeltena_maska, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

kontūrām kontūrās:

laukums = cv2.contourArea (kontūra)

ja (platība> 800):

x, y, w, h = cv2.boundingRect (kontūras) rāmis = cv2. taisnstūris (frame, (x, y), (x+w, y+h), (0, 0, 255), 10)

cv2.imshow ("izsekošana", rāmis)

k = cv2.waitKey (5) un 0XFF

ja k == 27: pārtraukums

cv2.destroyAllWindows ()

cap.release ()

2. solis: izsekojiet ceļu, pa kuru objekts ir pārvietojies

lai izsekotu ceļu:

i diapazonā (1, len (centra_punkti)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255), ja math.sqrt ((((centra_punkti [i - 1] [0] - centra_punkti [0]) ** 2) + ((centra_punkti [i - 1] [1] - centra_punkti [1]) ** 2)) <= 50: cv2.line (kadrs, centra_punkti [i - 1], centra_punkti , (b, g, r), 4)

3. solis: integrējiet abus kodus

es integrēšu abus kodus

importēt cv2import numpy kā np importēt izlases veidā no kolekcijām importēt deque

cap = cv2. VideoCapture (1)

# Lai izsekotu visiem punktiem, kur objekts tika apmeklēts center_points = deque ()

kamēr taisnība:

# Lasīt un pagriezt rāmi _, rāmis = vāks.lasīt () rāmis = cv2.flip (rāmis, 1)

# Nedaudz izplūdiniet rāmi

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

# Konvertēt no BGR uz HSV krāsu formātu

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

# Nosakiet atklājamo hsv krāsu apakšējo un augšējo diapazonu. Zils šeit

apakšējais_zils = np.masīvs ([100, 50, 50]) augšējais_zils = np.masīvs ([140, 255, 255]) maska = cv2.inRange (hsv, apakšējais_zils, augšējais_zils)

# Izveidojiet elipsveida kodolu

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

# Sākuma morfs (erozija, kam seko dilatācija)

maska = cv2.morphologyEx (maska, cv2. MORPH_OPEN, kodols)

# Atrodiet visas kontūras

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

ja len (kontūras)> 0:

# Atrodiet lielāko kontūru.

# Atrodiet kontūras centru un uzzīmējiet apli

momenti = cv2.moments (lielākais_kontūrs) centre_of_contour = (int (mirkļi ['m10'] / mirkļi ['m00']), int (mirkļi ['m01'] / mirkļi ['m00'])) cv2. aplis (kadrs, kontūras centrs, 5, (0, 0, 255), -1)

# Apvelciet kontūru ar apli

elipse = cv2.fit

# Saglabājiet kontūras centru, lai mēs to novilktu

center_points.appendleft (centra_punkts)

# Zīmējiet līniju no kontūras centra punktiem

i diapazonā (1, len (centra_punkti)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255), ja math.sqrt ((((centra_punkti [i - 1] [0] - centra_punkti [0]) ** 2) + ((centra_punkti [i - 1] [1] - centra_punkti [1]) ** 2)) <= 50: cv2.line (kadrs, centra_punkti [i - 1], centra_punkti , (b, g, r), 4)

cv2.imshow ('oriģināls', kadrs)

cv2.imshow ('maska', maska)

k = cv2.waitKey (5) un 0xFF

ja k == 27: pārtraukums

cv2.destroyAllWindows ()

cap.release ()

Ieteicams: