Taula de continguts:

Seguiment d'objectes Opencv: 3 passos
Seguiment d'objectes Opencv: 3 passos

Vídeo: Seguiment d'objectes Opencv: 3 passos

Vídeo: Seguiment d'objectes Opencv: 3 passos
Vídeo: Detecting color with Python and OpenCV using HSV colorspace | Computer vision tutorial 2024, Desembre
Anonim
Seguiment d'objectes Opencv
Seguiment d'objectes Opencv

La detecció d'objectes en moviment és una tècnica utilitzada en la visió per computador i el processament d'imatges. Diversos mètodes consecutius d’un vídeo es comparen mitjançant diversos mètodes per determinar si es detecta algun objecte en moviment.

La detecció d’objectes en moviment s’ha utilitzat per a una àmplia gamma d’aplicacions com la videovigilància, el reconeixement d’activitats, el control de l’estat de la carretera, la seguretat de l’aeroport, el control de la protecció al llarg de la frontera marítima, etc.

La detecció d'objectes en moviment consisteix a reconèixer el moviment físic d'un objecte en un lloc o regió determinats. [2] Actuant la segmentació entre objectes en moviment i àrea o regió estacionàries, es podria fer un seguiment del moviment dels objectes en moviment i, per tant, es podria analitzar posteriorment. Per aconseguir-ho, tingueu en compte que un vídeo és una estructura basada en fotogrames individuals; la detecció d’objectes en moviment consisteix a trobar els objectius mòbils en primer pla, ja sigui en cada fotograma de vídeo o només quan l’objectiu en moviment mostra la primera aparició al vídeo.

Utilitzaré la combinació Opnecv i Python per detectar i fer un seguiment dels objectes en funció del color

Pas 1: dibuixar un rectangle a l’objecte reconegut

si el vostre ordinador no té python ni opencv, seguiu això a continuació, insstructables

aquí teniu el codi python:

importa cv2import numpy com a np

cap = cv2. VideoCapture (0)

mentre que és cert:

_, 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, lower_yellow, upper_yellow)

(_, contorns, _) = cv2.findContours (màscara_groga, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

per a contorns en contorns:

area = cv2.contourArea (contorn)

si (àrea> 800):

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

cv2.imshow ("seguiment", marc)

k = cv2.waitKey (5) i 0XFF

si k == 27: trencar

cv2.destroyAllWindows ()

cap.release ()

Pas 2: traça el camí per on s'ha mogut l'objecte

per traçar el camí:

per a l’interval (1, len (punts_centres)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) si math.sqrt (((punts_centre [i - 1] [0] - punts_centre [0]) ** 2) + ((punts_centre [i - 1] [1] - punts_centre [1]) ** 2)) <= 50: cv2.line (marc, punts_centre [i - 1], punts_centre , (b, g, r), 4)

Pas 3: integració dels dos codis

Vaig a integrar tant el codi

importar cv2import numpy com np importar aleatòriament des de col·leccions

cap = cv2. VideoCapture (1)

# Per fer un seguiment de tots els punts on l'objecte ha visitat centres_punts = deque ()

mentre que és cert:

# Llegir i capgirar el marc _, frame = cap.read () frame = cv2.flip (frame, 1)

# Difuminar una mica el marc

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

# Converteix de format de color BGR a HSV

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

# Definiu l'interval inferior i superior del color hsv per detectar. Blau aquí

lower_blue = np.array ([100, 50, 50]) upper_blue = np.array ([140, 255, 255]) mask = cv2.inRange (hsv, lower_blue, upper_blue)

# Feu nucli el·líptic

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

# Morf d'obertura (erosió seguida de dilatació)

mask = cv2.morphologyEx (màscara, cv2. MORPH_OPEN, nucli)

# Cerca tots els contorns

contorns, jerarquia = cv2.findContours (mask.copy (), cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE) [- 2:]

si len (contorns)> 0:

# Troba el contorn més gran contorn_major = màxim (contorns, clau = cv2.contourArea)

# Cerqueu el centre del contorn i dibuixeu un cercle ple

moments = cv2.moments (major_contour) centre_of_contour = (int (moments ['m10'] / moments ['m00']), int (moments ['m01'] / moments ['m00'])) cv2.circle (frame, centre_contorn, 5, (0, 0, 255), -1)

# Lliga el contorn amb un cercle

el·lipse = cv2.fitEllipse (contorn_major) cv2.ellipse (marc, el·lipse, (0, 255, 255), 2)

# Deseu el centre del contorn per dibuixar-ne la línia

center_points.appendleft (centre_of_contour)

# Dibuixeu una línia des dels punts centrals del contorn

per a l’interval (1, len (punts_centres)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) si math.sqrt (((punts_centre [i - 1] [0] - punts_centre [0]) ** 2) + ((punts_centre [i - 1] [1] - punts_centre [1]) ** 2)) <= 50: cv2.line (marc, punts_centre [i - 1], punts_centre , (b, g, r), 4)

cv2.imshow ('original', marc)

cv2.imshow ('màscara', màscara)

k = cv2.waitKey (5) i 0xFF

si k == 27: trencar

cv2.destroyAllWindows ()

cap.release ()

Recomanat: