جدول المحتويات:

تتبع كائن Opencv: 3 خطوات
تتبع كائن Opencv: 3 خطوات

فيديو: تتبع كائن Opencv: 3 خطوات

فيديو: تتبع كائن Opencv: 3 خطوات
فيديو: Object Identification & Animal Recognition With Raspberry Pi + OpenCV + Python 2024, شهر نوفمبر
Anonim
تتبع كائن Opencv
تتبع كائن Opencv

كشف الكائن المتحرك هو تقنية تستخدم في رؤية الكمبيوتر ومعالجة الصور. تتم مقارنة الإطارات المتتالية المتعددة من الفيديو بطرق مختلفة لتحديد ما إذا تم اكتشاف أي جسم متحرك.

تم استخدام اكتشاف الأجسام المتحركة في مجموعة واسعة من التطبيقات مثل المراقبة بالفيديو ، والتعرف على الأنشطة ، ومراقبة حالة الطريق ، وسلامة المطارات ، ومراقبة الحماية على طول الحدود البحرية وما إلى ذلك.

الكشف عن الكائن المتحرك هو التعرف على الحركة المادية لكائن ما في مكان أو منطقة معينة. [2] من خلال تمثيل التجزئة بين الأجسام المتحركة والمنطقة أو المنطقة الثابتة ، يمكن تتبع حركة الأجسام المتحركة وبالتالي يمكن تحليلها لاحقًا. لتحقيق ذلك ، ضع في اعتبارك أن الفيديو عبارة عن هيكل مبني على إطارات فردية ، ويكمن اكتشاف الكائن المتحرك في العثور على الهدف (الأهداف) المتحركة الأمامية ، إما في كل إطار فيديو أو فقط عندما يظهر الهدف المتحرك أول ظهور في الفيديو.

سأستخدم تركيبة Opnecv و Python لاكتشاف وتتبع الكائنات بناءً على اللون

الخطوة 1: رسم مستطيل على كائن تم التعرف عليه

إذا لم يكن جهاز الكمبيوتر الخاص بك يحتوي على python أو opencv ، فيرجى اتباع ما يلي أدناه

ها هو كود الثعبان:

استيراد cv2import numpy كـ np

cap = cv2. VideoCapture (0)

احيانا صحيح:

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

low_yellow = np.array ([20، 110، 110])

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

yellow_mask = cv2.inRange (hsv، Lower_yellow، upper_yellow)

(_، contours، _) = cv2.findContours (yellow_mask، cv2. RETR_TREE، cv2. CHAIN_APPROX_SIMPLE)

للكونتور في الكنتور:

المنطقة = cv2.contourArea (كفاف)

إذا (المنطقة> 800):

x ، y ، w ، h = cv2.boundingRect (contour) frame = cv2.rectangle (frame، (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 ((((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

cap = cv2. VideoCapture (1)

# لتتبع كل نقطة حيث زار الكائن center_points = deque ()

احيانا صحيح:

# قراءة وقلب الإطار _ ، الإطار = غطاء القراءة () الإطار = cv2.flip (الإطار ، 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]) upper_blue = np.array ([140، 255، 255]) القناع = 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:]

إذا كان لين (ملامح)> 0:

# اعثر على أكبر محيط أكبر

# ابحث عن مركز الكنتور وارسم دائرة مملوءة

Moments = cv2.moments (large_contour) centre_of_contour = (int (لحظات ['m10'] / لحظات ['m00']) ، int (لحظات ['m01'] / لحظات ['m00'])) cv2.circle (إطار ، centre_of_contour، 5، (0، 0، 255)، -1)

# اربط الكفاف بدائرة

القطع الناقص = cv2.fitEllipse (large_contour) 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) إذا كانت 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 ()

موصى به: