תוכן עניינים:

מעקב אחר אובייקטים של Opencv: 3 שלבים
מעקב אחר אובייקטים של Opencv: 3 שלבים

וִידֵאוֹ: מעקב אחר אובייקטים של Opencv: 3 שלבים

וִידֵאוֹ: מעקב אחר אובייקטים של Opencv: 3 שלבים
וִידֵאוֹ: לואיס אליזונדו: מלשינים, UAPs, מסע בזמן [חלק 3!] 2024, נוֹבֶמבֶּר
Anonim
מעקב אחר אובייקטים של Opencv
מעקב אחר אובייקטים של Opencv

זיהוי עצמים נעים הוא טכניקה המשמשת בראייה ממוחשבת ועיבוד תמונות. מספר פריימים עוקבים מסרטון מושווים בשיטות שונות כדי לקבוע אם מזוהה אובייקט נע כלשהו.

זיהוי אובייקטים נעים שימש למגוון רחב של יישומים כמו מעקב וידאו, זיהוי פעילות, ניטור מצב הכביש, בטיחות שדות תעופה, ניטור הגנה לאורך הגבול הימי ועוד.

זיהוי אובייקט נע הוא לזהות את התנועה הפיזית של אובייקט במקום או באזור נתון. [2] על ידי הפעלת פילוח בין עצמים נעים ואזור או אזור נייח, ניתן לעקוב אחר תנועת האובייקטים הנעים וכך ניתן לנתח אותם מאוחר יותר. כדי להשיג זאת, שקול כי סרטון הוא מבנה הבנוי על מסגרות בודדות, זיהוי אובייקטים נעים הוא למצוא את היעדים הנעים בחזית, או בכל מסגרת וידאו או רק כאשר היעד הנע מציג את המראה הראשון בסרטון.

אני הולך להשתמש בשילוב של Opnecv ו- Python כדי לזהות את האובייקטים ולצפות עליהם בהתאם לצבע

שלב 1: ציור מלבן על האובייקט המוכר

אם למחשב שלך אין פייתון או opencv אנא עקוב אחר ההוראות שלהלן

הנה קוד הפיתון:

יבוא cv2import numpy כמו np

כובע = cv2. VideoCapture (0)

בעוד שזה נכון:

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

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

צהוב עליון = np.array ([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) אם math.sqrt ((((נקודות מרכז [i - 1] [0] - נקודות_מרכז [0]) ** 2) + ((נקודות_מרכז [i - 1] [1] - נקודות מרכז [1]) ** 2)) <= 50: cv2.line (מסגרת, נקודות_מרכז [i - 1], נקודות_מרכז , (b, g, r), 4)

שלב 3: שילוב שני הקודים

אני הולך לשלב את שני הקוד

יבוא cv2import numpy כ- np יבוא אקראי מאוסף יבוא קובץ

כובע = cv2. VideoCapture (1)

# כדי לעקוב אחר כל הנקודות בהן אובייקט ביקר במרכז_נקודות = deque ()

בעוד שזה נכון:

# קרא והפוך מסגרת _, frame = cap.read () frame = cv2.flip (מסגרת, 1)

# טשטשו מעט את המסגרת

blur_frame = cv2. GaussianBlur (מסגרת, (7, 7), 0)

# המר מ BGR לפורמט צבע HSV

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

# הגדר טווח תחתון ועליון של צבע hsv לזיהוי. כחול כאן

כחול נמוך = np.array ([100, 50, 50]) upper_blue = np.array ([140, 255, 255]) mask = cv2.inRange (hsv, lower_blue, upper_blue)

# הפוך גרעין אליפטי

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

# מורף פתיחה (שחיקה ואחריה הרחבה)

mask = cv2.morphologyEx (מסכה, cv2. MORPH_OPEN, גרעין)

# מצא את כל קווי המתאר

קווי מתאר, היררכיה = cv2.findContours (mask.copy (), cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE) [-2:]

אם len (קווי מתאר)> 0:

# מצא את המתאר הגדול ביותר_contour_contour = max (קווי מתאר, מפתח = cv2.contourArea)

# מצא את מרכז המתאר וצייר עיגול מלא

רגעים = cv2.moments (big_contour) centre_of_contour = (int (רגעים ['m10'] / רגעים ['m00']), int (רגעים ['m01'] / רגעים ['m00'])) cv2.circle (מסגרת, מרכז_קונטור, 5, (0, 0, 255), -1)

# כרוך את המתאר במעגל

אליפסה = cv2.fitEllipse (contour_contest) cv2.ellipse (מסגרת, אליפסה, (0, 255, 255), 2)

# שמור את מרכז המתאר כך שנצייר קו עוקב אחריו

center_points.appendleft (center_of_contour)

# צייר קו מנקודות המתאר המרכזיות

עבור i בטווח (1, len (center_points)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) אם math.sqrt ((((נקודות מרכז [i - 1] [0] - נקודות_מרכז [0]) ** 2) + ((נקודות_מרכז [i - 1] [1] - נקודות מרכז [1]) ** 2)) <= 50: cv2.line (מסגרת, נקודות_מרכז [i - 1], נקודות_מרכז , (b, g, r), 4)

cv2.imshow ('מקורי', מסגרת)

cv2.imshow ('מסכה', מסכה)

k = cv2.waitKey (5) & 0xFF

אם k == 27: הפסקה

cv2.destroyAllWindows ()

cap.release ()

מוּמלָץ: