Πίνακας περιεχομένων:

Παρακολούθηση αντικειμένων Opencv: 3 βήματα
Παρακολούθηση αντικειμένων Opencv: 3 βήματα

Βίντεο: Παρακολούθηση αντικειμένων Opencv: 3 βήματα

Βίντεο: Παρακολούθηση αντικειμένων Opencv: 3 βήματα
Βίντεο: Leap Motion SDK 2024, Νοέμβριος
Anonim
Παρακολούθηση αντικειμένων Opencv
Παρακολούθηση αντικειμένων Opencv

Η ανίχνευση κινούμενων αντικειμένων είναι μια τεχνική που χρησιμοποιείται στην όραση του υπολογιστή και στην επεξεργασία εικόνας. Πολλαπλά διαδοχικά καρέ από ένα βίντεο συγκρίνονται με διάφορες μεθόδους για να προσδιοριστεί εάν ανιχνεύεται κάποιο κινούμενο αντικείμενο.

Η ανίχνευση κινούμενων αντικειμένων έχει χρησιμοποιηθεί για ένα ευρύ φάσμα εφαρμογών όπως παρακολούθηση βίντεο, αναγνώριση δραστηριότητας, παρακολούθηση της οδικής κατάστασης, ασφάλεια του αεροδρομίου, παρακολούθηση της προστασίας κατά μήκος των θαλάσσιων συνόρων κ.λπ.

Η ανίχνευση κινούμενου αντικειμένου είναι η αναγνώριση της φυσικής κίνησης ενός αντικειμένου σε ένα δεδομένο μέρος ή περιοχή. [2] Ενεργώντας την κατάτμηση μεταξύ κινούμενων αντικειμένων και ακίνητων περιοχών ή περιοχών, η κίνηση των κινούμενων αντικειμένων θα μπορούσε να εντοπιστεί και έτσι θα μπορούσε να αναλυθεί αργότερα. Για να επιτευχθεί αυτό, σκεφτείτε ότι ένα βίντεο είναι μια δομή βασισμένη σε μεμονωμένα καρέ, η ανίχνευση κινούμενου αντικειμένου είναι να βρείτε τον (τους) κινούμενο (-ους) στόχο (ες) σε πρώτο πλάνο, είτε σε κάθε καρέ βίντεο είτε μόνο όταν ο κινούμενος στόχος εμφανίσει την πρώτη εμφάνιση στο βίντεο.

Θα χρησιμοποιήσω τον συνδυασμό Opnecv και Python για τον εντοπισμό και την παρακολούθηση των αντικειμένων με βάση το χρώμα

Βήμα 1: Σχεδιάζοντας ένα ορθογώνιο στο αναγνωρισμένο αντικείμενο

εάν ο υπολογιστής σας δεν έχει python ή opencv, ακολουθήστε αυτό το παρακάτω inststructables

εδώ είναι ο κώδικας python:

εισαγωγή cv2import numpy ως np

cap = cv2. VideoCapture (0)

ενώ True:

_, πλαίσιο = cap.read () hsv = cv2.cvtColor (πλαίσιο, cv2. COLOR_BGR2HSV)

χαμηλότερο_κίτρινο = μ.συστοιχία ([20, 110, 110])

άνω_κίτρινο = μ.συστοιχία ([40, 255, 255])

κίτρινη μάσκα = cv2.inRange (hsv, κάτω_κίτρινη, άνω_κίτρινη)

(_, περιγράμματα, _) = cv2.findContours (κίτρινη μάσκα, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

για περίγραμμα σε περιγράμματα:

περιοχή = cv2.contourArea (περίγραμμα)

εάν (περιοχή> 800):

x, y, w, h = cv2.boundingRect (περίγραμμα) πλαίσιο = cv2. ορθογώνιο (πλαίσιο, (x, y), (x+w, y+h), (0, 0, 255), 10)

cv2.imshow ("παρακολούθηση", πλαίσιο)

k = cv2.waitKey (5) & 0XFF

αν k == 27: διάλειμμα

cv2.destroyAllWindows ()

cap.release ()

Βήμα 2: Ανακαλύψτε το μονοπάτι στο οποίο έχει προχωρήσει το αντικείμενο

για να εντοπίσουμε το μονοπάτι:

για i στο εύρος (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 (frame, center_points [i - 1], center_points , (b, g, r), 4)

Βήμα 3: Ενσωμάτωση και των δύο κωδικών

πρόκειται να ενσωματώσω και τους δύο κώδικες

εισαγωγή cv2import numpy ως np εισαγωγή τυχαία από συλλογές deque εισαγωγής deque

cap = cv2. VideoCapture (1)

# Για παρακολούθηση όλων των σημείων όπου επισκέφθηκε το αντικείμενο center_points = deque ()

ενώ True:

# Διαβάστε και αναστρέψτε το πλαίσιο _, frame = cap.read () frame = cv2.flip (frame, 1)

# Θολώστε λίγο το πλαίσιο

blur_frame = cv2. GaussianBlur (πλαίσιο, (7, 7), 0)

# Μετατροπή από BGR σε μορφή χρώματος HSV

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

# Ορίστε το κάτω και το ανώτερο εύρος του χρώματος hsv για ανίχνευση. Μπλε εδώ

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

# Φτιάξτε ελλειπτικό πυρήνα

πυρήνας = cv2.getStructuringElement (cv2. MORPH_ELLIPSE, (15, 15))

# Μορφή ανοίγματος (διάβρωση ακολουθούμενη από διαστολή)

μάσκα = cv2.morphologyEx (μάσκα, cv2. MORPH_OPEN, πυρήνας)

# Βρείτε όλα τα περιγράμματα

περιγράμματα, ιεραρχία = cv2.findContours (mask.copy (), cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE) [-2:]

αν len (περιγράμματα)> 0:

# Βρείτε το μεγαλύτερο περίγραμμα

# Βρείτε το κέντρο του περιγράμματος και σχεδιάστε γεμάτο κύκλο

στιγμές = cv2.moments (το μεγαλύτερο_κείμενο) centre_of_contour = (int (στιγμές ['m10'] / στιγμές ['m00']), int (στιγμές ['m01'] / στιγμές ['m00'])) cv2.circle (καρέ, centre_of_contour, 5, (0, 0, 255), -1)

# Συνδέστε το περίγραμμα με κύκλο

έλλειψη = cv2.fitEllipse (το μεγαλύτερο_κείμενο) cv2.ellipse (πλαίσιο, έλλειψη, (0, 255, 255), 2)

# Αποθηκεύστε το κέντρο του περιγράμματος, ώστε να σχεδιάσουμε γραμμές παρακολουθώντας το

center_points.appendleft (centre_of_contour)

# Τραβήξτε γραμμή από τα κεντρικά σημεία του περιγράμματος

για i στο εύρος (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 (frame, center_points [i - 1], center_points , (b, g, r), 4)

cv2.imshow («πρωτότυπο», πλαίσιο)

cv2.imshow («μάσκα», μάσκα)

k = cv2.waitKey (5) & 0xFF

αν k == 27: διάλειμμα

cv2.destroyAllWindows ()

cap.release ()

Συνιστάται: