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 :

Calcul de distance


Sujet :

OpenCV

  1. #1
    Expert confirmé

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Par défaut Calcul de distance
    Bonjour,

    Voila ma situation est la suivante. J'ai une seule webcam avec laquelle je film, et je voudrais savoir si il existe un moyen avec OpenCV (ou autre) de calculer une distance entre la caméra et un objet quelconque ? Si oui comment pourrai-je procéder ?

    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Cette question me rappelle 2 sujets:
    1- le scanner en 3D pour réalise des objets 3D de différentes choses, usines, monuments, très gros objets (avion) etc. Dans ce type d'application, il y a toujours au moins 2 points de vue. Pour simplifier, la distance est calculée en fonction de l'angle de convergence des 2 visées sur un même point, à partir de chaque prise de vue.
    2- il y a eu il y a quelques mois une info d'un groupe d'universitaires anglais qui à l'aide d'une unique webcam, réalisait un objet interne 3d (moi j'appelle ça une image plastique) d'un objet quelconque.
    On peur imaginer l'algorithme qui permettrait (conditionnel) de calculer la position sans un certain repère 3D (lequel) d'un point de l'objet réel à partir des différentes visée faites d'une même webcam. Mais, j'y crois pas trop.
    A part cette première info, il n'y a pas eu de suite. Gag, intox, optimisme, je ne sais pas.

    Pour répondre à votre question, la seule piste me paraitrait d'exploiter la modification de la forme et surtout de sa dimension en fonction de ses déplacements.

    Cordialement.

  3. #3
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Bonjour.

    Si l'on veut repérer des objets connus (et solides) et qu'on est capable d'identifier suffisamment de points caractéristiques (7 je crois (dont un n'est pas coplanaire avec les autres)), on peut calculer la position d'un objet (à partir de sa matrice intinsèque, on peut reconstituer sa matrice extrinsèque qu'on peut par exemple calculer en considérent l'objet comme repère). Le nombre de points à calculer peut être également réduit si l'on fait certaines hypothèses (sur la position de la caméra, son orientation etc... ou bien la position et l'orientation de l'objet. dans le cas d'un objet symétrique , on peut fixer arbitrairement certains paramètres).

    C'est a mon avis la seule méthode vraiment connue permettant de détercter la position d'un objet avec une seule image (à part la projection de mires, mais ça revient au même que deux caméras).

    Bonne chance

  4. #4
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    si tu connais la hauteur de ton objet et la hauteur d'un autre objet (la hauteur de la caméra par exemple), le théorème de thales fonctionne très bien

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 25
    Par défaut
    C'est une bonne question.

    J'y suis arrivé avec une seule caméra mais j'ai utilisé une mire de calibrage pour me repérer dans la scène sinon tu ne peux pas y arriver je pense...

    Je te joins le calcul j'avais tout fais sur matlab. dans mon calcul ce que tu recherches c'est les coordonnées de ta caméra tx, ty et tz et en particulier tz qui donne la distance entre ton objet et ta caméra.

    Une fois que tu as pris ta photo il faut utiliser un logiciel comme gimp ou photoshop pour remplir le u et v de la matrice que j'ai appelé A (ça marche bien en en prenant 8 points et en les prenants au extrémités de ta mire).
    Tu prends les x et y et z
    en les mesurant sur ta scène réelle.

    ensuite le calcul te donne la distance de ta caméra à un point de ton image piur n'importe quel point.

    J'avais trouvé des résultats assez corrects mais peu précis.

    Voici le calcul :
    Fichiers attachés Fichiers attachés

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour Snake,
    Sur le plan général, c'est un problème très intéressant, mais pour donner des réponses plus précises, il faudrait des hypothèses plus précises.
    Il existe un chapitre en topométrie qui s'appelle la stadimétrie. Le but consiste à calculer une distance à partir d'un appareil vers un point donné. Naturellement, ce genre de chose se fait maintenent avec des appareils à réflexion d'onde, mis il n'est pas question ici de ces méthodes.
    Donc, en stadimétrie on dispose d'une stadia, c'est à dire une mire. Je ne rentrerai pas dans les détails, il y en aurait au moins pour une vingtaine de pages.
    Par contre, ce qu'il faut savoir, c'est que la distance mesurée sur la mire sera multipliée par un grand nombre. Cela signifie qu'il est très important pour la précision du résultat de connaitre de façon précise la position relative de la mire et de l'axe Caméra->objet, ainsi que l'angle de visée par rapport à l'horizontale, sauf si la mire est horizontale.

    Cette question me rappelle maintenant un troisième sujet : quelqu'un cherchait à positionner des panneaux publicitaires inaccessibles, parce que situés en domaine privé. Je ne pense pas qu'il y soit arrivé autrement qu'avec des méthodes traditionnelles.

    La finesse de la webcam est un élément fondamental, mais il faudrait avoir plus de détails.
    Cordialement.

  7. #7
    Expert confirmé

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Par défaut
    Tout d'abord merci de votre implication dans mon problème et de vos conseils

    Maintenant il est vrai que je n'ai pas été très exhaustif dans mes explications, je vais donc être plus précis pour que vous puissiez voir exactement ce que j'ai en tête de faire.

    La situation est la suivante, j'ai récemment fais l'acquisition d'un petit robot équipé d'un micro et d'une webcam qui peut avancer, reculer, tourner etc... sur demande. Je dispose aussi de tout le code source le concernant (interface graphique et coeur), lors du démarrage de l'interface graphique j'ai au milieu de celle-ci le rendu en temps réel de la caméra du robot.

    Ce que j'aimerai faire c'est que lorsqu'il avance et qu'il y a un obstacle quelconque à moins de 30cm celui-ci s'arrête tout seul sans que j'ai besoin d'intervenir.

    J'espère que vous voyez maintenant mieux ce que j'aimerais faire

    Pour les pistes que vous m'avez donné, auriez vous des exemples, des explications, des tutos ou autres à me fournir car je dois bien avoué que je n'ai jamais pratiqué la programmation dans ce domaine

    Encore merci en tout cas

  8. #8
    Invité
    Invité(e)
    Par défaut
    Oui, vraiment bien votre truc, mais d'après ce que vous dites, c'est impossible.

    Je m'explique. Une webcam donne une image instantanée. On peut la comparer aux images précédentes. Donc, la seule chose qu'on pourra détecter c'est que un élément de l'image actuelle (la dernière) cache, c'est à dire "passe devant" un élément de l'image juste précédente.
    Par contre, si on arrive à trouver un moyen de repérer des dimensions au sol, là, à tout instant, on pourra compter la distance qui lui reste avant un obstacle. Je pense par exemple à du carrelage. Mais encore faut-il que l'objet touche le sol, donc que l'on puisse voir sa position au sol.
    A creuser, ça m'amuse beaucoup.

    Je pense à une autre solution, à mon avis beaucoup plus facile à réaliser, on apprend au robot à se souvenir des obstacles. Il se cognera une fois, mais pas deux. C'est à dire qu'il fera le plan de la pièce où il se trouve au fur et à mesure de son apprentissage. Le soir il suffira qu'il aille se coucher et le lendemain, bon pied, bon oeil, il pourra repartir et se souviendra des erreurs de la veille. (je vous dirai pas mon age)
    Dernière modification par Invité ; 05/07/2010 à 19h57.

  9. #9
    Expert confirmé

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Par défaut
    Ah et en mémorisant quelques images est-il possible de voir qu'un objet grandit ? par superposition comme vous expliquiez.

    La solution de la mémorisation est intéressante seulement est valable que pour des obstacles fixes (tables, portes, murs, etc...) car si d'un coup je met une bouteille sur son chemin il ne s'arrêtera pas.

    J'aurais pourtant cru qu'il serait possible de traiter les informations que peut contenir une image car la webcam envoi son flux vidéo sous formes d'image, elle envoi donc autant d'image qu'elle peut en faire en 1sec. N'y a t-il pas un moyen de traiter cela ?

  10. #10
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par snake264 Voir le message
    Ah et en mémorisant quelques images est-il possible de voir qu'un objet grandit ? par superposition comme vous expliquiez.

    La solution de la mémorisation est intéressante seulement est valable que pour des obstacles fixes (tables, portes, murs, etc...) car si d'un coup je met une bouteille sur son chemin il ne s'arrêtera pas.

    J'aurais pourtant cru qu'il serait possible de traiter les informations que peut contenir une image car la webcam envoi son flux vidéo sous formes d'image, elle envoi donc autant d'image qu'elle peut en faire en 1sec. N'y a t-il pas un moyen de traiter cela ?
    le problème ici est alors de segmenter un objet.... s'il y en a un ça va, on sait faire, mais segmenter n'importe quel type d'objet... c'est beaucoup beaucoup plus dûr ... (c'est peut être possible mais pas encore réalisé). Ensuite, si tu te focalise sur un certain type d'objet,ça se fait.

    par exemple, voilà un ancien petit projet qui ressemble au tiens : (couper le son, y'a une vielle musique derriere)
    ici, ce ne sont pas les obstacle qu'on évite, mais on se place à la position des balles. la précision était d'environ 5-10% mais on avait réglé ça tres vite. par contre, comme le dit notre transformiste (en ligne ou en cercles), il faut auparavant calibrer la caméra sinon, y'a rien qui marche.

    Bonne chance

  11. #11
    Expert confirmé

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Par défaut
    Ok donc une des solutions serait donc de regarder la forme d'un objet, je fais regarder ça, existe t-il des algorithmes permettant de faire cela ?

    Sinon j'ai pensé aussi à faire une chose, collé une étiquette sur un objet et si il la reconnaît qu'il s'arrête, cela peut-il aussi marcher ?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Autre idée pendant la nuit, J'ai dit qu'il était impossible de calculer la distance entre la webcam, et l'objet. C'est impossible en statique, mais c'est possible en dynamique.
    Pendant un temps t le robot a avancé d'une distance dl, et un élément de l'image a grandit d'un rapport R. Il n'y a plus qu'à faire la règle de trois. Facile
    Bien sûr s'il existe de outils de comparaison d'image, ce sera déjà ça de fait.
    Cordialement.

  13. #13
    Expert confirmé

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Par défaut
    A oui en effet cette dernière méthode est extrèmement intéressante, par contre je pense qu'il faudrait pouvoir reconnaître un objet pour cela non ?

  14. #14
    Invité
    Invité(e)
    Par défaut
    Non, il est très difficile de reconnaître un objet avec un ordinateur. Le cerveau humain le fait très bien, d'abord parce qu'il a une vision binoculaire, puis parce qu'il a une capacité de mémoire, de classement, de logique qu'un ordinateur ne possède pas encore.
    Petit exemple simple : je suppose que sur la table devant laquelle vous êtes, il y a des tas d'objets plus ou moins hétéroclites. Votre vision binoculaire vous permet d'avoir une vision 3D de tous ces objets, donc, vous les voyez en relief. Maintenant fermez un oeil, vous avez supprimé la vision 3D. Percevez-vous la différence ? Non, je pense. Par contre si vous faites la même expérience en essayant de passer un stylo dans un anneau, sans autre repère, vous n'y arriverez plus. Tout ceci pour dire que ce qui parait intuitif devient quelque fois très difficile à réaliser avec une machine.

    Pour en revenir à notre problème, soit deux images du même objet prises à deux instants successifs correspondant au déplacement du robot. La machine n'a pas besoin de savoir si c'est un pied de table, un angle de mur ou le nounours de votre petite soeur, par contre il faudra lui apprendre que ces deux images se ressemblent, mais que l'une est légèrement plus grande que l'autre. Si vous avez réussi à lui apprendre ça, c'est gagné.
    Donc pour être plus précis, il faut identifier des couples de pixels, bien contrastés, dont on calcule l'évolution de leur distance, en fonction du temps.

    Par ailleurs, il existe de très petits appareils qui savent mesurer la distance qui les séparent d'un obstacle. Ces appareils sont basés sur le mesure du temps mis par un rayon pour faire l'allée et le retour. Mais il ne s'agit pas d'un webcam.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    D'accord je vois le truc. Et comment identifier deux couples de pixel ?

  16. #16
    Invité
    Invité(e)
    Par défaut
    Là, c'est vraiment pas facile, mais je pense qu'il faudrait mieux chercher sur un forum qui s'appellerait "Algorithme" plutôt que "Langage C++". Mais je vais y réfléchir.

  17. #17
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par snake264 Voir le message
    je pense qu'il faudrait pouvoir reconnaître un objet pour cela non ?
    oui... ça peut être facile, ça dépend principalement de l'objet... et de l'environement. les objets avec une couleur particulère sont tres facile à segmenter si l'envirenement comporte peu de cette couleur. Les objet présentant des structures récurrentes peuvent également faire l'objet d'une analyse de texture. Les objets composite, c'est déjà beaucoups plus dur... et mois y'a de symétrie, pire c'est.

    Par contre, supposons que tu te déplace dans un couloir avec des linteaux en bas.. ici, c'est simple: tu connais la taille des linteaux, une petite transformée de hough et une mesure de distance entre le haut et le bas des lintaux te donne un bon résultat. par contre, si tu te trouve en pleine foret avec de fougeres, des arbres des rochers et des sangliers, bonne chance (en esperant qu'il n'y ait pas de rivière, sinon noyade assurée).

    En plus complexe, et pour des données complexe, on peut utiliser les cascadeur de Haar.. mais c'est compliqué et très très long à entraîner (y'en a, ça prend 2 semaines de computations ininterompues)

    D'autre part, si l'objet n'est pas au centre de ta cam, il faut tenir comptes des déformations (multiplication par ta matrice des paramètre intrinsèques (ou sa transposée, je sais plus)).

    Sinon, si tu n'est pas fermé aux autres solutions, un petit module ultrason ou un télémetre infra-rouge resten très abordables et beaucoups plus fiables. ensuite, on peut prendre le télémetre laser ou utiliser des mires (laser ou lumineuse).

    bonne chance

  18. #18
    Expert confirmé

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Par défaut
    Et bien on peut dire que j'ai du boulot...

    Existe t-il déjà certaines méthodes implémenté dans OpenCV qui pourraient m'aider ?

  19. #19
    Invité
    Invité(e)
    Par défaut
    Je vais essayer d'expliquer ma façon de voir les choses.
    1- Recherche de point caractéristique.
    J'appelle point caractéristique le centre d'une zone dont les pixels sont suffisamment différenciés. Cette zone sera probablement choisie carrée, et probablement 7x7 ou 9x9.
    Cette opération sera faite forcément au démarrage et les points caractéristiques seront mis à jour en permanence.
    Je pense que 6 points caractéristiques serait une bonne approche, trois en partie supérieure, 3 en partie inférieure.

    2- les points caractéristiques sont mis à jour en permanence, c'est à dire à chaque instant t on peut comparer la position des points caractéristiques mémorisés à l'instant t-1, en tirer les informations voulues et les remplacer par leur nouvelle position.

    3- lorsqu'un point caractéristique sort de l'image, il est remplacé par un autre point caractéristique recherché du côté opposé à celui où était celui qui a disparu. Ainsi on dispose en permanence du même nombre de points.

    4- la nouvelle position d'un point caractéristique est par définition voisine de l'ancienne. La recherche sera limitée à un espace à fixer définitivement après essais.

    5 à tout moment on dispose de la figure définie par les point à l'instant t-1 et celle définie à l'instant t. La comparaison de ces deux figures de forme et de dimension très voisine donnera la position relative entre le robot et l'objet vu entre l'instant t-1 et l'instant t.

    Il y a des points qui sont nécessaires à connaitre pour affiner l'analyse. Par exemple, l'axe de la caméra est-il toujours horizontal ? Quelle est la vitesse de prise de vue de la caméra ? Quelle est la vitesse de déplacement du robot ? Quelle est la dimension en pixels de l'image ? etc.

    Je suppose que si ce traitement avait été prévu par OpenCV, ce serait indiqué dans la Doc.
    Voila
    Bonne soirée.

  20. #20
    Expert confirmé

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Par défaut
    Parfait je vais donc m'inspirer de ce que vous m'avez dit, mais d'abord en premier lieu je vais tenter de faire un algo qui puisse déjà suivre une couleur donné et ensuite je me mettrais au calcul d'une distance par rapport à la vision de cette couleur

    Merci beaucoup à tous pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. calculer la distance qu'il y a entre une div et le bas de page
    Par Henry9 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/09/2007, 00h33
  2. Problème et questions sur un calcul de distance
    Par ale2000 dans le forum Traitement d'images
    Réponses: 7
    Dernier message: 11/09/2007, 20h33
  3. Calculer des distances géodésiques
    Par ToTo13 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 30/11/2006, 08h59
  4. Calcul de distance entre deux points en WGS84
    Par marieR dans le forum Langage
    Réponses: 5
    Dernier message: 03/08/2006, 17h07
  5. [GEOMETRIE] calcul de distance dans un triangle
    Par gronaze dans le forum Mathématiques
    Réponses: 10
    Dernier message: 29/06/2006, 10h04

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