Cuprins:

Urmărirea obiectelor Opencv: 3 pași
Urmărirea obiectelor Opencv: 3 pași

Video: Urmărirea obiectelor Opencv: 3 pași

Video: Urmărirea obiectelor Opencv: 3 pași
Video: Parcare inteligenta in python cu opencv, easyOcr si Yolov5 Sistem de plata integrat Cod complet 2024, Noiembrie
Anonim
Urmărirea obiectelor Opencv
Urmărirea obiectelor Opencv

Detectarea obiectelor în mișcare este o tehnică utilizată în viziunea computerizată și procesarea imaginilor. Mai multe cadre consecutive dintr-un videoclip sunt comparate prin diferite metode pentru a determina dacă este detectat vreun obiect în mișcare.

Detectarea obiectelor în mișcare a fost utilizată pentru o gamă largă de aplicații precum supravegherea video, recunoașterea activității, monitorizarea stării drumurilor, siguranța aeroportului, monitorizarea protecției de-a lungul frontierei marine etc.

Detectarea obiectelor în mișcare este de a recunoaște mișcarea fizică a unui obiect într-un anumit loc sau regiune. [2] Prin acționarea segmentării între obiectele în mișcare și zona sau regiunea staționară, mișcarea obiectelor în mișcare ar putea fi urmărită și astfel ar putea fi analizată ulterior. Pentru a realiza acest lucru, considerați că un videoclip este o structură construită pe cadre unice, detectarea obiectelor în mișcare constă în găsirea țintei în mișcare din prim plan, fie în fiecare cadru video, fie numai atunci când ținta în mișcare prezintă prima apariție în videoclip.

Voi folosi combinația Opnecv și Python pentru a detecta și urmări obiectele pe baza culorii

Pasul 1: Desenarea unui dreptunghi pe obiectul recunoscut

dacă computerul dvs. nu are python sau opencv, vă rugăm să urmați acest lucru de mai jos

aici este codul python:

import cv2import numpy ca np

cap = cv2. VideoCapture (0)

în timp ce este adevărat:

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

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

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

yellow_mask = cv2.inRange (hsv, lower_yellow, upper_yellow)

(_, contururi, _) = cv2.findContours (mască_galbenă, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

pentru contur în contururi:

area = cv2.contourArea (contur)

dacă (suprafață> 800):

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

cv2.imshow („urmărire”, cadru)

k = cv2.waitKey (5) & 0XFF

dacă k == 27: pauză

cv2.destroyAllWindows ()

cap.release ()

Pasul 2: Urmăriți calea pe care s-a mutat obiectul

pentru a urmări calea:

pentru i în intervalul (1, len (centre_points)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) if math.sqrt (((centre_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (cadru, puncte_centrale [i - 1], puncte_centrale , (b, g, r), 4)

Pasul 3: Integrarea ambelor coduri

Voi integra atât codul

import cv2import numpy ca np import aleatoriu din colecții import deque

cap = cv2. VideoCapture (1)

# Pentru a urmări toate punctele în care obiectul a vizitat center_points = deque ()

în timp ce este adevărat:

# Citește și răstoarnă cadrul _, cadru = cap.read () cadru = cv2.flip (cadru, 1)

# Estompează puțin cadrul

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

# Convertiți din formatul de culoare BGR în HSV

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

# Definiți gama inferioară și superioară a culorii hsv pentru detectare. Albastru aici

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

# Faceți nucleu eliptic

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

# Morf de deschidere (eroziune urmată de dilatare)

mask = cv2.morphologyEx (mască, cv2. MORPH_OPEN, kernel)

# Găsiți toate contururile

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

dacă len (contururi)> 0:

# Găsiți conturul cel mai mare cont_cort = max (contururi, cheie = cv2.contourArea)

# Găsiți centrul conturului și desenați cercul umplut

momente = cv2.moments (contur_mai mare) centru_contur = (int (momente ['m10'] / momente ['m00']), int (momente ['m01'] / momente ['m00'])) cv2.circle (cadru, centru_conturului, 5, (0, 0, 255), -1)

# Legați conturul cu cercul

elipsă = cv2.fitEllipse (contur_cea mai mare) cv2.ellipse (cadru, elipsă, (0, 255, 255), 2)

# Salvați centrul conturului, astfel încât să trasăm linia de urmărire a acestuia

center_points.appendleft (centre_of_contour)

# Trageți linia din punctele centrale ale conturului

pentru i în intervalul (1, len (centre_points)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) if math.sqrt (((centre_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (cadru, puncte_centrale [i - 1], puncte_centrale , (b, g, r), 4)

cv2.imshow („original”, cadru)

cv2.imshow („mască”, mască)

k = cv2.waitKey (5) & 0xFF

dacă k == 27: pauză

cv2.destroyAllWindows ()

cap.release ()

Recomandat: