Съдържание:

Проследяване на обекти на Opencv: 3 стъпки
Проследяване на обекти на Opencv: 3 стъпки

Видео: Проследяване на обекти на Opencv: 3 стъпки

Видео: Проследяване на обекти на Opencv: 3 стъпки
Видео: Build Face Detection with Python using OpenCV (With link to the code) 2024, Ноември
Anonim
Проследяване на обекти на Opencv
Проследяване на обекти на Opencv

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

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

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

Ще използвам комбинацията Opnecv и Python за откриване и проследяване на обектите въз основа на цвета

Стъпка 1: Начертаване на правоъгълник върху разпознатия обект

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

ето кода на python:

импортиране на cv2import numpy като np

cap = cv2. VideoCapture (0)

докато е вярно:

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

по -ниска_жълта = np.array ([20, 110, 110])

горен_жълт = np.array ([40, 255, 255])

жълта_маска = cv2.inRange (hsv, долна_жълта, горна_жълта)

(_, контури, _) = cv2.findContours (жълта_маска, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

за контур в контури:

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

ако (площ> 800):

x, y, w, h = cv2.boundingRect (контур) рамка = cv2.rectangle (рамка, (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 (((централни точки [i - 1] [0] - централни точки [0]) ** 2) + ((центрови точки [i - 1] [1] - центрови точки [1]) ** 2)) <= 50: cv2.line (рамка, централни точки [i - 1], централни точки , (b, g, r), 4)

Стъпка 3: Интегриране на двата кода

ще интегрирам и двата кода

import 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)

# Направете елипсовидно ядро

ядро = 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:

# Намерете най -големия контур najveći_контур = макс (контури, ключ = cv2.contourArea)

# Намерете центъра на контура и нарисувайте запълнен кръг

моменти = cv2.моменти (най -голям контур) център_контур = (int (моменти ['m10'] / моменти ['m00']), int (моменти ['m01'] / моменти ['m00']) cv2.circle (кадър, център_контур, 5, (0, 0, 255), -1)

# Свържете контура с кръг

ellipse = cv2.fitEllipse (najveći_контур) 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) if 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 ()

Препоръчано: