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

OpenGL Discussion :

Modèle 3D à partir de photos


Sujet :

OpenGL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 41
    Points : 12
    Points
    12
    Par défaut Modèle 3D à partir de photos
    Bonjour à tous !

    Voilà alors j'ai décidé de me lancer dans un projet de modélisation 3D.
    A savoir qu'avant tout, je veux faire au plus simple.
    Si j'arrive à modéliser une boite carrée ou rectangulaire toute bête à partir de photos c'est déjà bien.

    Le principe étant: je prends plusieurs photos de l'objet sous différents angles (une simple boite rectangulaire pour commencer) et je souhaite modéliser cette boite en 3D.
    L'objectif est donc de passer d'un plan 2D à un plan 3D.

    Ceci étant, j'aimerai savoir sur quels outils m'orienter: C, C++, ... avec quelle bibliothèque (openGL, openCV,...)


    Merci à vous

  2. #2
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut
    Passer d'une photo 2D à un modèle 3D risque d'être très compliqué et demander beaucoup de traitement d'image pour un résultat pas forcément constant. C'est difficile d'interpréter du volume juste à partir de couleurs. Après c'est pas impossible mais certainement pas simple.

    En général les scanners 3D se basent sur un balayage par laser, qui permet de connaitre la distance entre le capteur et le modèle, et ainsi de constituer un nuage de point. Ensuite à partir de ce nuage de point on applique l'algorithme de Delaunay pour reconstituer la surface.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    Merci pour ta réponse

    Un résultat pas forcément constant c'est pas bien grave, c'est pour un projet individuel à l'université et l'on m'a dit que c'était pas forcément facile. L'essentiel étant qu'à la fin je ramène pas forcément le résultat mais au moins le début d'une solution.
    J'ai par exemple une boite rectangulaire.
    J'ai fais 10 photos (vus de face, 45°avant-droit,vue de droite, 45° arrière-droit, vue de derrière,...)
    Sur chaque photos j'ai mis les coordonnées 3D des sommets visibles donc sur toutes les photos j'ai forcément des sommets en commun avec d'autres vues.
    L'objectif est donc de construire une boite à partir des différentes coordonnées 3D de tous les sommets que l'on voit dans les photos.

    Seulement comment faire correspondre les sommets qui sont identiques entre les différentes vues ?

    Je vais me renseigner sur l'algorithme de Delaunay

  4. #4
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut
    Si tes photos sont données dans un ordre précis (tu tournes toujours dans le même sens en les prenants), alors tu dois pouvoir retrouver tes sommets d'une image à l'autre.
    Si tu sais détecter tes sommets par traitement d'images, et que tu tournes d'un angle connu autour de ton modèle, cela revient au même que d'avoir deux points de vue de l'objet comme dans les systèmes de triangulation à deux caméras. Je te conseille de regarder du côté de la géométrie épipolaire.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    Oui si y'a que ça, je peux passer les photos dans l'ordre.
    Pour détecter les sommets oui j'y travaille avec OpenCV et ça devrai pas me poser de soucis, au pire on m'a dit que je pouvais carrément récupérer les coordonnées des sommets en cliquant sur eux avec la souris (auquel cas je stockerai les coordonnées de la souris dans un tableau à chaque clic).

    Pour la géométrie épipolaire, merci pour la piste, c'est exactement ce que je souhaite faire, j'ai lu attentivement, ça à l'air un peu complexe à comprendre mais après les calculs sont les mêmes pour tous les points.
    Si j'ai bien compris, je peux utiliser la librairie d'OpenCV aussi pour réaliser cela ?

    Merci beaucoup pour ton aide

  6. #6
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut
    Effectivement les calculs sont complexes, j'avais bossé sur le sujet lors d'un projet sur la capture de mouvement il y a maintenant... 10 ans. Du coup c'est plus très frais, alors pour t'aider ça risque d'être compliqué Mais oui il me semble que OpenCV peut te mâcher le travail.

    Bon courage.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    Merci à toi, bon finalement je suis parti sur OpenGL et Glew mais peut être qu'a un moment j'aurai besoin d'openCV.
    J'ai modéliser une scène avec un cube (qui serait l'objet à photographier sous différents angles)
    Je fais des rotations de 45 degrés du cube pour prendre les différentes photos.

    Maintenant j'ai besoin d'identifier les points 2D dans le repère 3D afin de les faire correspondre sous chaque vue.
    Pour cela j'aimerai déjà colorier les sommets lorsque je clique dessus avec la souris sauf que je bloque parce que les coordonnées de la souris sont bien transmise à la fonction mais rien ne s'affiche au clic.
    Je sais que les coordonnées de la souris correspondent aux coordonnées sur l'écran et pas sur la scène donc j'ai même essayé des coordonnées en dur pour être sur de bien être dans la scène mais toujours rien.

    Une solution ou une autre idée à proposer ?

    Merci à vous

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    J'ai avancé un peu, j'arrive à récupérer les coordonnées 3D dans la scène du pixel sur lequel je clique.
    Maintenant la problématique est: j'ai un cube, je le fais tourner sur x de 45 degrés mais lorsque je clique sur les sommets qui ont donc bougés, il m'indique toujours les coordonnées d'origines.
    Comment lui faire recalculer les coordonnées 3D des sommets après la rotation ?

    Merci

    EDIT: C'est bon j'arrive à récupérer les coordonnées 3D des sommets même après des rotations. Je peux donc enregistrer la position des différents sommets pour chaque vue.
    La problématique est maintenant de les faire correspondre entre les vues.

    Une idée ?

  9. #9
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut
    Et bien à part le fait que tu sais à peu près à quoi t'attendre, vu que tu as tourné de 45°, je ne vois pas vraiment. Une autre solution serait de marquer les coins avec une certaines couleurs, mais c'est peut-être un peu "tricher".
    Disons que les plans fixes ne facilitent pas vraiment la chose. Avec une caméra l'intérêt est qu'il y a une certaine continuité.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    Ah ça serait mieux de faire tourner la caméra autours de l'objet que de le faire tourner sur lui même ?
    Pour les couleurs, justement j'ai demandé et l'on ma effectivement dit que je pouvais marqué les coins avec une couleur. Mais comment réaliser cela ?

    Merci

  11. #11
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut
    Ah ça serait mieux de faire tourner la caméra autours de l'objet que de le faire tourner sur lui même ?
    En fait ça revient au même comme dirait Albert, tout n'est qu'histoire de relativité !

    Donc si je comprends bien, pour l'instant ton cube n'existe que dans ton moteur 3D ? Tu n'utilises pas encore de photos ?

    Si c'est dans le moteur 3D, simplement en dessinant en plus les vertex du cube avec GL_POINTS ? une autre technique serait d'utiliser un geometry shader, mais j'ai l'impression que tu commences l'OpenGL donc c'est peut-être un peu compliqué. Tiens, tu utilises quelle version d'OpenGL au passage ?

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    Tiens je sais pas si ça peut t'aider en tout cas ça m'avait bluffé :
    http://research.microsoft.com/en-us/...calablefusion/
    http://research.microsoft.com/pubs/217574/voxelhash.pdf

    Il s'agit de construction 3d en live (mais à partir d'une Kinect, donc déjà il ne s'agit pas forcément de simple photo).

  13. #13
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    Voilà, tu as tout juste, ce n'est qu'un cube 3D pour l'instant.
    Au final ça ne me sert à rien de récupérer les coordonnées 3D des points puisque dans une photo il n'y a pas de profondeur.

    Du coup j'extrait juste les coordonnées en X,Y et j'ai réussi à récupérer ma matrice de projection (qui sera toujours fixe puisque la caméra ne bouge pas) et ma matrice de modelview qui elle changera avec les rotations.

    Maintenant que j'ai tout ça il me semble que je dois dire "sur une vue un point est là, sur une autre il est là" et cela à partir d'un calcul avec les deux matrices non ? (cependant lequel j'ignore, je pencherai avec l'inverse d'une matrice)
    Et oui je débute tout juste, je commence à bien assimiler les notions de base mais la notion de "matrices" jusque là c'était vraiment flou. C'est aussi pour ça que j'ai choisi ce projet, j'apprend plein de choses qui me sont utiles

    J'ai regardé la vidéo c'est vraiment impressionnant, puis c'est vraiment en temps réel sans bug et les détails sont là.
    En fait je me construit un drône en même temps et j'avais justement pensé à faire ce genre de chose mais sur une vidéo déjà enregistrée (depuis le drône) et qu'on modélise ensuite en 3D mais je sais bien que c'est loin d'être à ma portée pour l'instant.
    Merci pour les liens

  14. #14
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut
    En gros tu as, pour une même position 3D, 2 positions 2D différentes avec 2 matrices ModelView différentes :
    Si je dis pas de conneries, on doit pouvoir poser quelque-chose du genre :
    Pos2D(1) = MV(1).P x Pos3D => Pos3D = inv(MV(1).P) x Pos2D(1)
    Pos2D(2) = MV(2).P x Pos3D => Pos3D = inv(MV(2).P) x Pos2D(2)

    => inv(MV(1).P) x Pos2D(1) = inv(MV(2).P) x Pos2D(2)
    => MV(2).P x inv(MV(1).P) x Pos2D(1) = Pos2D(2)

    L'objectif va être de trouver le point 2D qui s'approche le plus de MV(2).P x inv(MV(1).P) x Pos2D(1)
    Il faut donner un seuil d'erreur car le point peut se retrouver caché.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    Ah merci, au niveau des calculs je vois le principe pour retrouver le point 2D mais j'ai pas trop compris pourquoi l'on aurai 2 position 2D pour une même position 3D? Une du "premier plan", une du "second plan" ?

    Niveau code j'ai avancé un peu du coup mais mon professeur m'a conseillé d'utiliser la fonction glFrustum à la place de gluPersperctive ce qui nous faciliterai la tâche apparemment (je suis entrain de parcourir la doc de glFrustum)
    EDIT: C'est bon je pense avoir compris pourquoi l'on à deux positions 2D pour une même position 3D, forcément elles ne seront pas les mêmes selon l'angle de vue.

  16. #16
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut
    Oui le principe c'est que tu considère que ton cube ne bouge pas, seule la caméra se déplace. Les positions 3D sont donc inchangées.

    Alors glFrustrum & gluPerspective, ça fait quelques années que j'ai abandonné tout ça. C'est le vieux OpenGL (<2.0), maintenant, elles sont deprecated. Ce qui est sympa avec le vieux OpenGL, c'est qu'on fait rapidement des petits choses. Son gros désavantage, c'est qu'on a moins de contrôle et que c'est plus opaque.
    L'OpenGL moderne est un peu plus compliqué à prendre en main (faut capter le principe des shaders, et il faut construire soit même ses matrices), mais ensuite on sait exactement ce que l'on fait.
    Mais bon en regardant à droite à gauche, j'ai bien l'impression que dans les écoles ils sont restés globalement au vieux OpenGL. Faut faire avec Mais bon faut pas se leurrer, tôt ou tard faudra apprendre l'OpenGL moderne. Ou alors se servir d'un moteur 3D basé dessus. Il y a trop de différences de fonctionnalités et de performances entre les deux !

  17. #17
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    J'ai implémenté le fonction GlFrustum, j'obtiens bien ma matrice de projection.
    Ma matrice de projection est fixe puisque c'est l'objet qui tourne sur lui même de 45 degrés par rotation.


    Maintenant j'ai les coordonnées 2D du point que je clique dans la scène mais j'ai besoin de ramener ces coordonnées au coordonnées écran. Je n'ai pas trouvé grand choses sur Internet.
    La fonction GluUnProject() me permet d'avoir les coordonnées mais dans la scène (fenêtre de dessin).

  18. #18
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Point de la scène (modèle) -> vers point à l'écran, c'est la projection ultra classique des jeux vidéo.
    Quelques tutoriels pour la comprendre :


    Soit, c'est la transformation qui est réalisée avec la matrice Model View Projection.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  19. #19
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Si tu cherches un truc pas très compliqué.. (nuages de points et reconstructions à partir de vidéo exclus bien évidemment), la reconstruction 3D à partir de trois vues différentes était un de mes petits projets d'étudiant il y a à peu près un million d'années :
    http://www.massal.net/stereovision/stereovision.pdf

    Les bases sur la triangulation (deux vues suffisent) n'ont pas changé. Juste le résultat était un peu dégueu et inutilisable .

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  20. #20
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 41
    Points : 12
    Points
    12
    Par défaut
    Merci pour votre aide

    J'ai regardé ton pdf, c'est très constructif merci, c'est effectivement le résultat que je souhaite obtenir (en un peu plus performant si j'y arrive) mais si j'atteins pas le résultat c'est pas grave, le but étant d'aller le plus loin possible.
    Je n'ai juste pas la partie contours puisque c'est directement moi qui clique sur les sommets de l'objet (une simple boite).

    A ce niveau, j'ai mis en place un glfrustum() à la place d'un gluperspective()
    J'ai donc ma matrice modelview, ma matrice de projection, ma matrice de rotation, et une matrice de translation (dont je me sers juste pour décaler mon cube), et les coordonnées 2D écran X,Y du point où je clique.
    Aucun souci pour les matrices, y'a bien ce que je veux dedans et j'ai calculé les matrices inverses.

    Maintenant, je dois passer ces coordonnées X,Y à ma matrice inverse de GlFrustum(), bien que j'ai regardé la documentation, je ne comprend pas comment faire pour lui passer les coordonnées ? Je suppose que je dois faire les calculs que tu m'a indiqué JBX 2.0 ?

Discussions similaires

  1. Obtenir un modèle 3D à partir d'une photo
    Par blop85 dans le forum Images
    Réponses: 4
    Dernier message: 09/03/2010, 15h28
  2. [Image] Reconstruction 3D à partir de photos 2D
    Par Ivory69 dans le forum Traitement d'images
    Réponses: 29
    Dernier message: 14/10/2009, 16h29
  3. Réponses: 7
    Dernier message: 20/09/2009, 20h28
  4. Réponses: 0
    Dernier message: 18/09/2009, 15h39
  5. Reconstitution modèle 3D à partir d'images
    Par bianchi_999 dans le forum Développement 2D, 3D et Jeux
    Réponses: 12
    Dernier message: 31/01/2008, 12h38

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