Ask Your Question

Revision history [back]

How to measure the time an object is in an area

Hi, I have a program that detects a ball with color detection. I would like to measure the speed of my object and to do that I have created a zone with 2 lines. I would like to know the time the ball is in this zone but I don't know how. I tried with the module time but it seems complicated to incorporate it in a loop while. Sorry for my English, I'm a French student.

import cv2
import numpy as np
import time

debut = 0
cap = cv2.VideoCapture(0)

while True:

retour, image = cap.read()
k = cv2.waitKey(5) & 0xFF
if k == 27:
    break

hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # Conversion BGR à HSV

couleur_basse = np.array([20,100,100]) # Choix de la plage de couleur la plus basse
couleur_haute = np.array([30,255,255]) # Choix de la plage de couleur la plus haute

masque = cv2.inRange(hsv, couleur_basse, couleur_haute) # On crée un masque qui ne garde que la plage de couleur choisie
masque = cv2.erode(masque, None, iterations=2) # Facultatif mais plus précis
masque = cv2.dilate(masque, None, iterations=2) # Facultatif mais plus précis

moments = cv2.moments(masque) # On crée un dictionnaire qui recensent les positions
centre_x, centre_y = None, None # On crée les coordonnées du centre

if moments['m00'] != 0: # Permet de ne pas diviser par 0
    centre_x = int(moments['m10']/moments['m00'])
    centre_y = int(moments['m01']/moments['m00'])

if centre_x != None and centre_y != None: # Si les coordonnées existent, on les associe au centre 
    centre = (centre_x, centre_y)

    cv2.circle(image, centre, 25, (0,0,0)) # On crée un marqueur qui suit la balle

cv2.line(image,(10,0),(10,1000),(0,0,255),5)
cv2.line(image,(100,0),(100,1000),(0,0,255),5)

if centre_x != None :
    if centre_x >= 10 and centre_x <= 100:
        debut = time.clock()



cv2.imshow('image',image) # Affichage de la vidéo originale
cv2.imshow('masque',masque) # Affichage de la vidéo avec le masque


cap.release()
cv2.destroyAllWindows()