Отслеживание объектов OpenCV: 3 шага
Отслеживание объектов OpenCV: 3 шага
Anonim
Отслеживание объектов OpenCV
Отслеживание объектов OpenCV

Обнаружение движущихся объектов - это метод, используемый в компьютерном зрении и обработке изображений. Несколько последовательных кадров из видео сравниваются различными методами, чтобы определить, обнаружен ли какой-либо движущийся объект.

Обнаружение движущихся объектов используется для широкого спектра приложений, таких как видеонаблюдение, распознавание активности, мониторинг состояния дорог, безопасность в аэропортах, мониторинг защиты вдоль морской границы и т. Д.

Обнаружение движущегося объекта - это распознавание физического движения объекта в заданном месте или регионе. [2] Сегментация между движущимися объектами и стационарной областью или областью позволяет отслеживать движение движущихся объектов и, таким образом, анализировать их позже. Чтобы достичь этого, рассмотрите видео как структуру, построенную на одиночных кадрах, обнаружение движущегося объекта заключается в обнаружении движущейся цели (целей) на переднем плане либо в каждом кадре видео, либо только тогда, когда движущаяся цель появляется в видео впервые.

Я собираюсь использовать комбинацию Opnecv и Python для обнаружения и отслеживания объектов на основе цвета.

Шаг 1: рисование прямоугольника на распознанном объекте

если на вашем компьютере нет python или opencv, следуйте инструкциям ниже

вот код Python:

импортировать cv2import numpy как np

cap = cv2. VideoCapture (0)

в то время как True:

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

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

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

yellow_mask = cv2.inRange (hsv, нижний_желтый, верхний_желтый)

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

для контура в контурах:

area = cv2.contourArea (контур)

если (площадь> 800):

x, y, w, h = cv2.boundingRect (контур) 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) if math.sqrt (((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (кадр, center_points [i - 1], center_points , (b, g, r), 4)

Шаг 3: интеграция обоих кодов

я собираюсь интегрировать оба кода

import cv2import numpy as np import random from collection import deque

cap = cv2. VideoCapture (1)

# Для отслеживания всех точек посещения объекта center_points = deque ()

в то время как True:

# Прочитать и перевернуть frame _, 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]) upper_blue = np.array ([140, 255, 255]) маска = cv2.inRange (hsv, lower_blue, upper_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:

# Находим самый большой контур most_contour = max (contours, key = cv2.contourArea)

# Найдите центр контура и нарисуйте заполненный круг

моменты = cv2.moments (самый большой_контур) centre_of_contour = (int (моменты ['m10'] / моменты ['m00']), int (моменты ['m01'] / моменты ['m00'])) cv2.circle (кадр, центральный_контур, 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 (кадр, 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 ()

Рекомендуемые: