IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Comment calculer la distance réelle entre une caméra et un objet ?


Sujet :

OpenCV

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Décembre 2011
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 52
    Points : 34
    Points
    34
    Par défaut Comment calculer la distance réelle entre une caméra et un objet ?
    Bonsoir,

    Actuellement en 2ème année d'école d'ingénieurs, j'utilise, dans le cadre d'un projet robotique, OpenCV pour effectuer un suivi.

    Concrètement, il s'agit pour notre ASV (Autonomous Surface Vessel) équipé d'une caméra et de deux propulseurs de suivre une bouée (rouge) tractée par un bateau à moteur, en devant rester à une certaine distance de celui-ci.

    Pour l'instant, voici les étapes successives:

    - Passage du domaine RGB à HSV
    - Seuillage pour conserver les pixels rouges
    - Application d'un filtre CV_GAUSSIAN pour éliminer le bruit
    - Erosion pour supprimer les pixels isolés
    - (éventuellement Dilatation)
    - Calcul des moments de l'image qui me permet (si le filtre gaussien et l'érosion sont suffisants) de récupérer le barycentre de ma forme.

    Ainsi, j'ai découpé mon image en 3 parties. Au milieu de l'image se trouve une zone où mes deux propulseurs tournent à la même vitesse et où l'on considère donc que le robot est "en face" de la cible. De part et d'autre de cette zone, on agit, suivant l'éloignement de la cible (calculé grâce au barycentre) par rapport à l'axe central de la caméra et via une régulation (non définie pour l'instant), sur les deux propulseurs.

    Jusqu'ici çà va à peu près.

    Comme vous l'aurez compris, le problème suivant l'axe des x (horizontal dans le plan de la caméra) est réglé (l'axe des y ne nous intéresse pas).

    Cependant, ça se complique lorsque l'on s'intéresse à la distance entre la cible et la caméra (profondeur).

    En effet, nous avions pensé à trouver une relation entre l'aire de la cible calculé par OpenCV et la distance réelle entre la cible et la caméra, en effectuant par exemple une régression (linéaire, puissance,...).

    J'aurai donc aimé savoir si vous aviez un avis sur notre méthode et/ou si vous aviez d'autres méthodes à nous suggérer pour trouver la distance réelle entre la caméra et la cible.

    Merci!

  2. #2
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Citation Envoyé par neon29200 Voir le message
    En effet, nous avions pensé à trouver une relation entre l'aire de la cible calculé par OpenCV et la distance réelle entre la cible et la caméra, en effectuant par exemple une régression (linéaire, puissance,...).
    Bonjour,

    Ça me parait pas mal. Soit vous faites un apprentissage basé sur des images de la bouée à différentes distances connues puis vous estimer la relation entre l'aire observée (ou le diamètre de la bouée qui me parait mieux (regarder du côté de l'ellipse-fitting)) comme vous le précisiez. Soit vous pouvez aussi partir d'un modèle/template de la bouée (établi sur des connaissances a priori de la géométrie de la bouée), vous déterminez au préalable les paramètres intrinsèques de la caméra puis vous calculez la distance à partir d'observations/images. Dans les 2 cas il y aura une phase d'apprentissage ou d’étalonnage si vous voulez être relativement précis.

    Est-ce que ça répond à votre question ? est-ce que mes explications restent compréhensibles ?
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Décembre 2011
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    Merci beaucoup de votre réponse!

    A l'heure actuelle, le soucis qui pourrait se poser est que si notre caméra détecte un autre objet rouge (bateau, autre bouée,...) le barycentre calculé sera faussé et donc le comportement du robot s'en trouvera altéré.

    De plus, si la bouée n'est pas une sphère parfaite, lorsque qu'elle n'est pas parfaitement alignée avec l'axe de la caméra, l'angle sous lequel elle est vue modifiera la valeur de l'aire et faussera l'estimation de la distance.

    La méthode que vous proposez, via le calcul du grand axe de l'ellipse et de son centre, répond donc parfaitement à notre besoin. De plus, pour éviter d'être perturbé par d'éventuels autres "cibles", il faudrait donc, au-delà de la couleur rouge, "reconnaître" la forme (sphère ou tore à priori), un peu à l'image de CamShift que j'ai récemment découvert.

    Auriez-vous un algorithme, ou tout du moins les étapes nécessaires à cela?

    Merci beaucoup!

  4. #4
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Il faudra commencer par déterminer les contours des formes (qui potentiellement correspondent à la bouée), les évaluer selon les critères de formes et finalement appliquer l'ellipse-fitting sur celui qui est vraisemblablement celui de la bouée.
    Une méthode de suivi (= en calculant les contours de la frame k en repartant des ceux de la frame k-1) peut faciliter le choix de la forme (par exemple en incluant un critère de distance (à minimiser) entre le contour de la bouée à k-1 et les formes candidates sur la frame k).

    En espérant que ça vous inspire.
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Décembre 2011
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    Je vois grosso modo l'idée, mais n'étant que débutant en traitement d'images, je vois pas du tout comment faire.
    Je posterai sous peu mon code actuel.

    EDIT: CamShift pourrait-il faire l'affaire?

  6. #6
    Membre habitué

    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Mars 2011
    Messages : 115
    Points : 188
    Points
    188
    Par défaut
    Bonjour,
    C'est problème d'éstimation d'états
    Tu pourra aussi utiliser (pour plus de précission)
    - L'Algo Filtre De Kalman Discret
    - Ou le Modèle Hidden Markov
    Je pense que OpenCv implémente déjà le Kalman Filter
    Innovation = Blending of idea , science and practice engineering

Discussions similaires

  1. [Mappy] Comment calculer la distance entre deux coordonnées ?
    Par Malek Belkahla dans le forum Bibliothèques & Frameworks
    Réponses: 5
    Dernier message: 17/01/2013, 12h06
  2. Réponses: 44
    Dernier message: 05/07/2012, 23h29
  3. [Mappy] [API Challenge] Comment calculer la distance entre deux coordonnées ?
    Par Malek Belkahla dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 06/07/2010, 11h26
  4. Réponses: 4
    Dernier message: 14/11/2008, 20h56
  5. Réponses: 3
    Dernier message: 02/06/2008, 16h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo