Мазмуну:

Opencv объектилерине көз салуу: 3 кадам
Opencv объектилерине көз салуу: 3 кадам

Video: Opencv объектилерине көз салуу: 3 кадам

Video: Opencv объектилерине көз салуу: 3 кадам
Video: OpenCV Course - Full Tutorial with Python 2024, Декабрь
Anonim
Opencv объектилерине көз салуу
Opencv объектилерине көз салуу

Кыймылдуу объекттерди аныктоо - бул компьютердин көрүү жана сүрөттү иштетүү үчүн колдонулган ыкма. Видеодогу бир нече ырааттуу кадрлар ар кандай ыкмалар менен салыштырылып, кандайдыр бир кыймылдуу объект табылганын аныктайт.

Кыймылдуу объекттерди аныктоо видеобайкоо, активдүүлүктү таануу, жолдун абалын көзөмөлдөө, аэропорттун коопсуздугу, деңиз чегарасында коргоонун мониторинги ж.

Кыймылдуу объекттерди аныктоо - бул белгилүү бир жерде же аймакта объектинин физикалык кыймылын таануу. [2] Кыймылдуу объектилердин жана кыймылсыз аймактын же региондун ортосунда сегменттөө аркылуу, кыймылдуу объекттердин кыймылын көзөмөлдөп, кийинчерээк анализдөөгө болот. Буга жетүү үчүн, видео - бул бир кадрларга курулган структура, кыймылдуу объектти аныктоо - бул ар бир видео кадрда же кыймылдуу максат видеонун биринчи көрүнүшүн көрсөткөндө гана алдыңкы пландагы кыймылдуу бута (ларды) табуу.

Мен Opnecv жана Python комбинациясын колдонуп, түскө негизделген объектилерди байкап, байкап турам

1 -кадам: Таанылган объектке тик бурчтук тартуу

Эгерде сиздин компьютериңизде python же opencv жок болсо, төмөндөгү бузулбай турган нерселерди аткарыңыз

бул жерде python коду:

nv катары cv2import numpy импорттоо

cap = cv2. VideoCapture (0)

чын болсо:

_, frame = cap.read () hsv = cv2.cvtColor (кадр, cv2. COLOR_BGR2HSV)

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

жогорку_сары = np.array ([40, 255, 255])

yellow_mask = cv2.inRange (hsv, төмөнкү_сары, жогорку_сары)

(_, контурлар, _) = cv2.findContours (yellow_mask, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

контурдагы контур үчүн:

аянты = cv2.contourArea (контур)

эгерде (аймак> 800):

x, y, w, h = cv2.boundingRect (contour) frame = cv2.cectangle (frame, (x, y), (x+w, y+h), (0, 0, 255), 10)

cv2.imshow ("көз салуу", кадр)

k = cv2.waitKey (5) & 0XFF

if k == 27: break

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 (кадр, борбордук_пункттар [i - 1], борбордук_пункттар , (b, g, r), 4)

3 -кадам: Эки кодду интеграциялоо

Мен экөөнүн кодун бириктирейин деп жатам

cv2import numpy катары np импорттоо коллекциялардан туш келди импорттоо

cap = cv2. VideoCapture (1)

# Объект барган бардык чекиттерди көзөмөлдөө үчүн center_points = deque ()

чын болсо:

# Окуп, фреймди _, кадр = cap.read () кадр = 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]) жогорку_көк = 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.moments (эң чоң_контур) centre_of_contour = (int (учурлар ['m10'] / моменттер ['m00']), int (учурлар ['m01'] / моменттер ['m00'])) cv2. тегерек (алкак, centre_of_contour, 5, (0, 0, 255), -1)

# Контурду тегерек менен байла

эллипс = cv2.fitEllipse (ири_контур) cv2.ellipse (кадр, эллипс, (0, 255, 255), 2)

# Контурдун борборун сактаңыз, андыктан биз аны көзөмөлдөөчү линияны тартабыз

center_points.appendleft (центр_контуру)

# Контурдун борбордук чекиттеринен сызык чийиңиз

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 (кадр, борбордук_пункттар [i - 1], борбордук_пункттар , (b, g, r), 4)

cv2.imshow ('оригинал', кадр)

cv2.imshow ('маска', маска)

k = cv2.waitKey (5) & 0xFF

if k == 27: break

cv2.destroyAllWindows ()

cap.release ()

Сунушталууда: