Ceci est une ancienne révision du document !
Table des matières
Approximation de vitesse en Python
Idée générale
Avec ce nouveau projet, nous allons estimer la vitesse d'un objet se déplaçant perpendiculairement à la caméra de notre Raspberry à une distance donnée, comme illustré par le schéma ci-dessous.
Pour estimer cette vitesse, nous aurons besoin de:
- mesurer le déplacement d'un objet en pixels entre deux images capturées par la caméra.
- calculer à partir de ce déplacement et de la distance “caméra/trajectoire” la vitesse qu'on cherche.
Mesure du déplacement
Pour mesurer le déplacement, on va utiliser de la détection de mouvement.
Pour cette partie du projet, je vous recommande de consulter ce site pour des détails précis sur l'implémentation, mais vous allez voir, l'idée est simple.
On va simplement prendre une image de référence et à partir des différences qu'on observera avec les nouvelles images, on déduira la nouvelle position de notre objet.
# Notre image de référence firstFrame = cv2.cvtColor(firstFrame, cv2.COLOR_BGR2GRAY) firstFrame = cv2.GaussianBlur(firstFrame, (21, 21), 0) firstFrame = firstFrame.astype("float") # ... while frame_count < 400: grabbedAFrame, frame = cam.read() if not grabbedAFrame: continue frame_count = frame_count + 1 grayFrame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) greyFrame = cv2.GaussianBlur(grayFrame, (21, 21), 0) cv2.accumulateWeighted(greyFrame, firstFrame, 0.5) diff = cv2.absdiff(cv2.convertScaleAbs(firstFrame), greyFrame) thresh = cv2.threshold(diff, 24, 255, cv2.THRESH_BINARY)[1] thresh = cv2.dilate(thresh, None, iterations=2) _, contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
En mesurant le temps écoulé entre chaque mesure du déplacement, on est en mesure d'obtenir une vitesse en pixels par seconde. Reste maintenant à se ramener à une vitesse en m/s (ou autre, au choix).
Calcul de la vitesse
Bilan et sources du projet
Auteur: S. Durand