Სარჩევი:

Opencv ობიექტის თვალყურის დევნება: 3 ნაბიჯი
Opencv ობიექტის თვალყურის დევნება: 3 ნაბიჯი

ვიდეო: Opencv ობიექტის თვალყურის დევნება: 3 ნაბიჯი

ვიდეო: Opencv ობიექტის თვალყურის დევნება: 3 ნაბიჯი
ვიდეო: Leap Motion SDK 2024, ნოემბერი
Anonim
Opencv ობიექტის თვალყურის დევნება
Opencv ობიექტის თვალყურის დევნება

მოძრავი ობიექტის გამოვლენა არის ტექნიკა, რომელიც გამოიყენება კომპიუტერული ხედვისა და სურათის დამუშავების პროცესში. ვიდეოს მრავალი ზედიზედ კადრი შედარებულია სხვადასხვა მეთოდით, რათა დადგინდეს აღმოჩენილია რაიმე მოძრავი ობიექტი.

მოძრავი საგნების გამოვლენა გამოყენებულია პროგრამების ფართო სპექტრში, როგორიცაა ვიდეო მეთვალყურეობა, საქმიანობის ამოცნობა, გზის მდგომარეობის მონიტორინგი, აეროპორტის უსაფრთხოება, საზღვრის გასწვრივ დაცვის მონიტორინგი და ა.

მოძრავი ობიექტის გამოვლენა არის ობიექტის ფიზიკური მოძრაობის ამოცნობა მოცემულ ადგილას ან რეგიონში. [2] მოძრავი საგნებისა და სტაციონარული ფართობის ან რეგიონის სეგმენტირების მოქმედებით, მოძრავი საგნების მოძრაობა შეიძლება თვალყური ადევნოს და ამით მოგვიანებით გაანალიზდეს. ამის მისაღწევად, ჩათვალეთ, რომ ვიდეო არის სტრუქტურა, რომელიც აგებულია ერთ ჩარჩოზე, მოძრავი ობიექტების გამოვლენა არის წინა პლანზე მოძრავი სამიზნე (ების) პოვნა, თითოეული ვიდეოს ჩარჩოში, ან მხოლოდ მაშინ, როდესაც მოძრავი სამიზნე აჩვენებს ვიდეოს პირველ გამოჩენას.

მე ვაპირებ გამოვიყენო Opnecv და Python კომბინაცია, რათა დავადგინო და თვალყური ადევნო ობიექტებს ფერის მიხედვით

ნაბიჯი 1: მართკუთხედის დახატვა აღიარებულ ობიექტზე

თუ თქვენს კომპიუტერს არ აქვს პითონი ან ღია ვიდეო, მიჰყევით ქვემოთ მოცემულ ინსტრუქციას

აქ არის პითონის კოდი:

იმპორტი cv2 იმპორტი numpy როგორც np

cap = cv2. ვიდეო გადაღება (0)

მართალია:

_, ჩარჩო = cap.read () hsv = cv2.cvtColor (ჩარჩო, cv2. COLOR_BGR2HSV)

ქვედა_ ყვითელი = np. მასივი ([20, 110, 110])

ზედა_ ყვითელი = np. მასივი ([40, 255, 255])

ყვითელი_ ნიღაბი = cv2.inRange (hsv, ქვედა_ ყვითელი, ზედა_ ყვითელი)

(_, კონტურები, _) = cv2.findContours (yellow_mask, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

კონტურებისთვის კონტურებისთვის:

ფართობი = cv2.contourArea (კონტური)

თუ (ფართობი> 800):

x, y, w, h = cv2.bounding

cv2.imshow ("თვალთვალი", ჩარჩო)

k = cv2.waitKey (5) & 0XFF

თუ k == 27: შესვენება

cv2.destroyAllWindows ()

cap. გამოშვება ()

ნაბიჯი 2: იპოვნეთ გზა, რომელშიც გადავიდა ობიექტი

გზის დასადგენად:

მე დიაპაზონში (1, ლენ (ცენტრალური_პუნქტები)): ბ = შემთხვევითი. რანდიტი (230, 255) გ = შემთხვევითი. რანდიტი (100, 255) r = შემთხვევითი. რანდინტი (100, 255) თუ მათემატიკა. sqrt ((((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (ჩარჩო, ცენტრის_ წერტილები [i - 1], ცენტრის_ წერტილები , (b, g, r), 4)

ნაბიჯი 3: ორივე კოდის ინტეგრირება

მე ვაპირებ ორივე კოდის ინტეგრირებას

იმპორტი cv2 იმპორტი numpy როგორც np იმპორტი შემთხვევითი კოლექციიდან იმპორტი დეკე

cap = cv2. ვიდეო გადაღება (1)

# თვალყური ადევნეთ ყველა იმ ადგილს, სადაც ობიექტი მოინახულა ცენტრი_პუნქტები = გადახრა ()

მართალია:

# წაიკითხეთ და გადაატრიალეთ ჩარჩო _, ჩარჩო = cap.read () ჩარჩო = cv2.flip (ჩარჩო, 1)

# ოდნავ დაბინდეთ ჩარჩო

blur_frame = cv2. GaussianBlur (ჩარჩო, (7, 7), 0)

# გადაიყვანეთ BGR– დან HSV ფერის ფორმატში

hsv = cv2.cvtColor (ბუნდოვანი ჩარჩო, cv2. COLOR_BGR2HSV)

# განსაზღვრეთ hsv ფერის ქვედა და ზედა დიაპაზონი გამოვლენის მიზნით. აქ ლურჯი

ქვედა_ ლურჯი = np.array ([100, 50, 50]) above_blue = np.array ([140, 255, 255]) ნიღაბი = cv2.inRange (hsv, ქვედა_ ლურჯი, ზედა_ ლურჯი)

# გააკეთეთ ელიფსური ბირთვი

ბირთვი = 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.contourArea)

# იპოვეთ კონტურის ცენტრი და დახაზეთ შევსებული წრე

მომენტები = cv2. მომენტები (უდიდესი_კონტური) centre_of_contour = (int (მომენტები ['m10'] / მომენტები ['m00']), int (მომენტები ['m01'] / მომენტები ['m00'])) cv2.წრე (ჩარჩო, ცენტრის_კონკურსი, 5, (0, 0, 255), -1)

# შეკრული კონტური წრეზე

ელიფსი = cv2.fitEllipse (უდიდესი_კონტური) cv2.ellipse (ჩარჩო, ელიფსი, (0, 255, 255), 2)

# შეინახეთ კონტურის ცენტრი, ასე რომ ჩვენ დავხატავთ მის თვალთვალის ხაზს

center_points.appendleft (centre_of_contour)

# დახაზეთ ხაზი კონტურის ცენტრალური წერტილებიდან

მე დიაპაზონში (1, ლენ (ცენტრალური_პუნქტები)): b = შემთხვევითი. რანდიტი (230, 255) გ = შემთხვევითი. რანდიტი (100, 255) r = შემთხვევითი. რანდიტი (100, 255) თუ მათემატიკა. sqrt ((((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [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. გამოშვება ()

გირჩევთ: