Opencv Object Tracking: 3 steg
Opencv Object Tracking: 3 steg
Anonim
Opencv Object Tracking
Opencv Object Tracking

Rörelseobjektdetektering är en teknik som används vid datorsyn och bildbehandling. Flera ramar i rad från en video jämförs med olika metoder för att avgöra om något rörligt objekt detekteras.

Rörelseobjektdetektering har använts för ett brett spektrum av applikationer som videoövervakning, aktivitetsigenkänning, vägtillståndsövervakning, flygplats säkerhet, övervakning av skydd längs marin gräns och etc.

Rörelseobjektdetektering är att känna igen den fysiska rörelsen för ett objekt på en given plats eller region. [2] Genom att agera segmentering bland rörliga föremål och stationärt område eller område kan rörliga föremåls rörelse spåras och kan således analyseras senare. För att uppnå detta, överväga att en video är en struktur byggd på enstaka ramar, rörlig objektdetektering är att hitta förflyttningsobjekt i förgrunden, antingen i varje videoram eller bara när det rörliga målet visar det första utseendet i videon.

Jag ska använda Opnecv och Python -kombinationen för att upptäcka och spåra objekten baserat på färgen

Steg 1: Rita en rektangel på det igenkända objektet

Om din dator inte har python eller opencv, följ det här nedan

här är pythonkoden:

importera cv2import numpy som np

cap = cv2. VideoCapture (0)

medan det är sant:

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

lägre_gul = np.array ([20, 110, 110])

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

gul_mask = cv2.inRange (hsv, lägre_gul, övre_gul)

(_, konturer, _) = cv2.findContours (gul_mask, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

för kontur i konturer:

område = cv2.contourArea (kontur)

om (område> 800):

x, y, w, h = cv2.boundingRect (kontur) ram = cv2.rektangel (ram, (x, y), (x+w, y+h), (0, 0, 255), 10)

cv2.imshow ("spårning", ram)

k = cv2.waitKey (5) & 0XFF

om k == 27: paus

cv2.destroyAllWindows ()

cap.release ()

Steg 2: Spåra sökvägen som objektet har flyttat sig i

för att spåra vägen:

för i i intervallet (1, len (center_points)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) if math.sqrt ((((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (ram, center_points [i - 1], center_points , (b, g, r), 4)

Steg 3: Integrera båda koder

Jag ska integrera båda koden

import cv2import numpy som np importera slumpmässigt från samlingar import deque

cap = cv2. VideoCapture (1)

# För att hålla reda på alla punkter där objektet besökt center_points = deque ()

medan det är sant:

# Läs och vänd ram _, ram = cap.read () ram = cv2.flip (ram, 1)

# Oskärpa ramen lite

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

# Konvertera från BGR till HSV -färgformat

hsv = cv2.cvtColor (oskärpa_ram, cv2. COLOR_BGR2HSV)

# Definiera nedre och övre intervallet för hsv -färg att upptäcka. Blå här

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

# Gör elliptisk kärna

kärna = cv2.getStructuringElement (cv2. MORPH_ELLIPSE, (15, 15))

# Öppningsmorph (erosion följt av vidgning)

mask = cv2.morphologyEx (mask, cv2. MORPH_OPEN, kärna)

# Hitta alla konturer

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

om len (konturer)> 0:

# Hitta den största konturen grutste_kontur = max (konturer, nyckel = cv2.contourArea)

# Hitta konturcentrum och rita en fylld cirkel

moment = cv2.moments (största_kontur) centre_of_contour = (int (moment ['m10'] / ögonblick ['m00']), int (ögonblick ['m01'] / ögonblick ['m00'])) cv2.circle (ram, center_of_contour, 5, (0, 0, 255), -1)

# Bind konturen med cirkel

ellips = cv2.fitEllipse (största_kontur) cv2.ellipse (ram, ellips, (0, 255, 255), 2)

# Spara mitten av konturen så att vi drar en linje som spårar den

center_points.appendleft (center_of_contour)

# Dra linje från mittpunkten av konturen

för i i intervallet (1, len (center_points)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) if math.sqrt ((((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (ram, center_points [i - 1], center_points , (b, g, r), 4)

cv2.imshow ('original', ram)

cv2.imshow ('mask', mask)

k = cv2.waitKey (5) & 0xFF

om k == 27: paus

cv2.destroyAllWindows ()

cap.release ()

Rekommenderad: