diy:projets:approximationvitesse
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| diy:projets:approximationvitesse [2018/07/18 21:18] – [Bilan et sources du projet] sdurand | diy:projets:approximationvitesse [2018/07/19 12:41] (Version actuelle) – [Bilan et sources du projet] sdurand | ||
|---|---|---|---|
| Ligne 3: | Ligne 3: | ||
| ==== Idée générale ==== | ==== Idée générale ==== | ||
| - | //**Je ne garantis en aucun cas la qualité de la méthode | + | //**Je ne garantis en aucun cas la qualité de la méthode |
| - | 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. | + | 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** |
| {{: | {{: | ||
| Pour estimer cette vitesse, nous aurons besoin de: | Pour estimer cette vitesse, nous aurons besoin de: | ||
| - | * **mesurer le déplacement d'un objet** en pixels | + | * **mesurer le déplacement d'un objet** en pixel entre deux images capturées par la caméra. |
| * **calculer** à partir de ce déplacement et de la distance " | * **calculer** à partir de ce déplacement et de la distance " | ||
| + | |||
| ==== Mesure du déplacement ==== | ==== Mesure du déplacement ==== | ||
| Pour mesurer le déplacement, | Pour mesurer le déplacement, | ||
| - | Pour cette partie du projet, je vous recommande de consulter [[https:// | + | Pour cette partie du projet, je vous recommande de consulter [[https:// |
| 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**. | 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**. | ||
| Ligne 37: | Ligne 38: | ||
| frame_count = frame_count + 1 | frame_count = frame_count + 1 | ||
| | | ||
| - | # On passe en niveau de gris et on floute pour éviter | + | # On passe en niveau de gris et on floute pour limiter |
| grayFrame = cv2.cvtColor(frame, | grayFrame = cv2.cvtColor(frame, | ||
| greyFrame = cv2.GaussianBlur(grayFrame, | greyFrame = cv2.GaussianBlur(grayFrame, | ||
| Ligne 47: | Ligne 48: | ||
| thresh = cv2.threshold(diff, | thresh = cv2.threshold(diff, | ||
| - | # On dilate un peu le résultat et on récupère les contours, parmis ces contours, on aura notre objets | + | # On dilate un peu le résultat et on récupère les contours, parmis ces contours, on aura notre objet en mouvement (si le seuillage qu'on a choisi est adapté) |
| thresh = cv2.dilate(thresh, | thresh = cv2.dilate(thresh, | ||
| _, contours, _ = cv2.findContours(thresh.copy(), | _, contours, _ = cv2.findContours(thresh.copy(), | ||
| </ | </ | ||
| - | On récupèrera ensuite les coordonnées de notre objets | + | On récupèrera ensuite les coordonnées de notre objet en mouvement en passant par une boîte enveloppante, |
| <code Python> | <code Python> | ||
| x, y, w, h = cv2.boundingRect(cnt_m) | x, y, w, h = cv2.boundingRect(cnt_m) | ||
| Ligne 60: | Ligne 61: | ||
| {{: | {{: | ||
| - | En **mesurant le temps écoulé entre chaque mesure** du déplacement, | + | En **mesurant le temps écoulé entre chaque mesure** du déplacement, |
| ==== Calcul de la vitesse ==== | ==== Calcul de la vitesse ==== | ||
| - | On a désormais la vitesse | + | On a désormais la vitesse |
| <code Python> | <code Python> | ||
| import math | import math | ||
| - | # On calcule au préalable la distance en mètre que va représenté | + | # On calcule au préalable la distance en mètre que va représenter |
| fov = math.radians(53.5) | fov = math.radians(53.5) | ||
| meters_per_pixel = 2 * math.sin(fov/ | meters_per_pixel = 2 * math.sin(fov/ | ||
| Ligne 74: | Ligne 76: | ||
| Il ne vous reste plus qu'à multiplier ce nombre par le déplacement en pixel par seconde, et voilà, **vous avez la vitesse de votre objet !** | Il ne vous reste plus qu'à multiplier ce nombre par le déplacement en pixel par seconde, et voilà, **vous avez la vitesse de votre objet !** | ||
| + | |||
| ==== Bilan et sources du projet ==== | ==== Bilan et sources du projet ==== | ||
| Malheureusement, | Malheureusement, | ||
| - | Il semblerai quand même que les résultats qu'on obtient soient cohérents à vitesse de marche/ | + | Il semblerai quand même que les résultats qu'on obtient soient cohérents à vitesse de marche/ |
| <code Python> | <code Python> | ||
| Ligne 152: | Ligne 155: | ||
| x, y, w, h = cv2.boundingRect(cnt_m) | x, y, w, h = cv2.boundingRect(cnt_m) | ||
| newMid = x + w/2 | newMid = x + w/2 | ||
| - | | + | |
| + | pixels_per_sec = abs(newMid - boxMid)/elapsed | ||
| print(' | print(' | ||
| print(' | print(' | ||
| - | print(' | + | print(' |
| t1 = t2 | t1 = t2 | ||
| boxMid = newMid | boxMid = newMid | ||
| - | # A dé-commenter si vous voulez un retour | + | # A dé-commenter si vous voulez un retour |
| # cv2.rectangle(greyFrame, | # cv2.rectangle(greyFrame, | ||
diy/projets/approximationvitesse.1531948736.txt.gz · Dernière modification : de sdurand
