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 : 2018/07/18 21:18 de sdurand