Tartalomjegyzék:

Opencv objektumkövetés: 3 lépés
Opencv objektumkövetés: 3 lépés

Videó: Opencv objektumkövetés: 3 lépés

Videó: Opencv objektumkövetés: 3 lépés
Videó: Изучение Python OpenCV / Урок #3 – Создание объектов и вывод информации 2024, November
Anonim
Opencv objektumkövetés
Opencv objektumkövetés

A mozgó objektumok észlelése a számítógépes látásban és képfeldolgozásban alkalmazott technika. Egy videó több egymást követő képkockáját különböző módszerekkel hasonlítják össze annak megállapítása érdekében, hogy érzékel -e mozgó tárgyat.

A mozgó objektumok észlelését számos alkalmazásban használták, mint például a videó megfigyelés, a tevékenységfelismerés, az út állapotának megfigyelése, a repülőtéri biztonság, a tengeri határ mentén történő védelem felügyelete stb.

A mozgó objektumok észlelése az objektum fizikai mozgásának felismerését jelenti egy adott helyen vagy régióban. [2] A mozgó tárgyak és az álló terület vagy régió közötti szegmentálással a mozgó tárgyak mozgása nyomon követhető, és így később elemezhető. Ennek elérése érdekében tegyük fel, hogy a videó egyetlen képkockákra épülő szerkezet, a mozgó objektumok észlelése az, hogy megtalálják az előtérben lévő mozgó célpontokat, vagy mindegyik videókeretben, vagy csak akkor, ha a mozgó célpont először mutatja be a videót.

Opnecv és Python kombinációt fogok használni az objektumok észlelésére és nyomon követésére a szín alapján

1. lépés: Téglalap rajzolása a felismert objektumra

Ha a számítógépen nincs python vagy opencv, kövesse az alábbi utasításokat

itt a python kód:

cv2import numpy importálása np -ként

cap = cv2. VideoCapture (0)

míg igaz:

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

alsó_sárga = np.tömb ([20, 110, 110])

felső_sárga = np.array ([40, 255, 255])

sárga_maszk = cv2.inRange (hsv, alsó_sárga, felső_sárga)

(_, kontúrok, _) = cv2.findContours (sárga_maszk, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

kontúrokhoz kontúrok esetén:

terület = cv2.contourArea (kontúr)

ha (terület> 800):

x, y, w, h = cv2.boundingRect (kontúr) frame = cv2. rectangle (frame, (x, y), (x+w, y+h), (0, 0, 255), 10)

cv2.imshow ("követés", keret)

k = cv2.waitKey (5) & 0XFF

ha k == 27: törés

cv2.destroyAllWindows ()

cap.release ()

2. lépés: Keresse meg az útvonalat, amelyen az objektum elmozdult

nyomon követni az utat:

i esetén a (1, len (középpont))): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255), ha math.sqrt ((((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (keret, középpontok [i - 1], középpontok , (b, g, r), 4)

3. lépés: Mindkét kód integrálása

integrálom mind a kettő kódot

import cv2import numpy np -ként import véletlenszerűen gyűjteményekből import deque

cap = cv2. VideoCapture (1)

# Az összes olyan pont nyomon követéséhez, ahol az objektum meglátogatta center_points = deque ()

míg igaz:

# Keret olvasása és fordítása _, frame = cap.read () frame = cv2.flip (keret, 1)

# Kicsit elmossa a keretet

blur_frame = cv2. GaussianBlur (frame, (7, 7), 0)

# Konvertálás BGR -ből HSV színformátumba

hsv = cv2.cvtColor (blur_frame, cv2. COLOR_BGR2HSV)

# Határozza meg az észlelhető hsv szín alsó és felső tartományát. Kék itt

alsó_kék = np.tömb ([100, 50, 50]) felső_kék = np.tömb ([140, 255, 255]) maszk = cv2.inRange (hsv, alsó_kék, felső_kék)

# Készítsen elliptikus kernelt

kernel = cv2.getStructuringElement (cv2. MORPH_ELLIPSE, (15, 15))

# Nyitó morfium (erózió, majd dilatáció)

maszk = cv2.morphologyEx (maszk, cv2. MORPH_OPEN, kernel)

# Keresse meg az összes kontúrt

kontúrok, hierarchia = cv2.findContours (mask.copy (), cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE) [-2:]

ha len (kontúrok)> 0:

# Keresse meg a legnagyobb kontúrt legnagyobb_kontúr = max (kontúrok, kulcs = cv2.contourArea)

# Keresse meg a kontúr középpontját, és rajzoljon betöltött kört

pillanatok = cv2.moments (legnagyobb_kontúr) center_of_contour = (int (pillanatok ['m10'] / pillanatok ['m00']), int (pillanatok ['m01'] / pillanatok ['m00'])) cv2.circle (frame, kontúr középpontja, 5, (0, 0, 255), -1)

# Korlátozza körbe a kontúrt

ellipszis = cv2.fit

# Mentse el a kontúr középpontját, így rajzoljuk a nyomvonalat

center_points.appendleft (kontúr középpontja)

# Rajzoljon vonalat a kontúr középpontjaiból

i esetén a (1, len (középpont))): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255), ha math.sqrt ((((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (keret, középpontok [i - 1], középpontok , (b, g, r), 4)

cv2.imshow ('eredeti', keret)

cv2.imshow ('maszk', maszk)

k = cv2.waitKey (5) & 0xFF

ha k == 27: törés

cv2.destroyAllWindows ()

cap.release ()

Ajánlott: