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 :

Corrections de surfaces


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 27
    Par défaut Corrections de surfaces
    Bonjour !

    Je suis électronicien mais dans le cadre de mon travail, on m'a assigné un projet informatique pour lequel je manque cruellement d'expérience et de savoir faire.
    Je viens donc, si possible, solliciter votre aide !

    En soit, la tâche va peut être sembler facile pour certains (?) :

    je dois être capable de redresser des surfaces courbées pour les rendre planes en respectant les dimensions.
    Voici un exemple de surface que je suis censé pouvoir redresser : http://static-p3.fotolia.com/jpg/00/...Ld4yZiEmiD.jpg


    Pour faire ce traitement d'image je me suis tourné vers la librairie OpenCV car on trouve beaucoup de documentations dessus.

    Dans un premier temps j'ai voulu faire passer la courbure de la forme comme étant une distorsion de la caméra afin de pouvoir utiliser les fonctions cvCalibrateCamera2 et cvUndistort (Toutes les images étant prises par l'intermédiaire d'une caméra).

    L'idée était donc de projeter un damier sur la surface, d'en faire la capture, et en fonction de la courbure du damier redresser la surface.
    Néanmoins cette méthode ne donne pas grand chose.

    La deuxième idée, et je pense que celle la à plus de chances d'aboutir, est de projeter de simples droites horizontales sur la surface.
    Si la surface est parfaitement plane, les lignes projetées paraîtront donc horizontales et droites et aucun redressement ne sera nécessaire.
    Par contre si la surface est courbée, les lignes projetées seront déformées (en suivant la courbure de la surface) et en fonction de la déformation de ces lignes -> redresser l'image pour les rendre horizontales.
    voici un exemple d'image ou on peut voir l'effet de la courbure d'une surface sur des lignes droites : http://www.adobe.com/fr/designcenter...agewarp_10.jpg

    Néanmoins je n'ai aucune idée de comment implémenter cela sous OpenCV.
    Si quelqu'un à une meilleure idée, un exemple de code source, une référence, ou n'importe quoi d'autre qui puisse m'aiguiller, je suis preneur !

    Je vous remercie.

  2. #2
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Par défaut
    La deuxième me semble plus prometteuse.
    L'idée est de mettre en correspondance une grille (mesh) constituée de sous-carrés.
    Une fois que vous avez détectés les bords déformés de votre plaque, et que ce bord est modélisé par une courbe (une des diverses splines disponibles : B-spline, nurbs ou autre), vous pouvez considérer (en tout cas dans l'exemple ici) que toutes les mailles de votre mesh sont déformés de la même manière.
    En warpant la spline pour obtenir une droite, vous pouvez alors warper tous les pixels compris dans chaque carré pour obtenir une surface aplanie.

    Si la déformation n'est pas la même sur toute la plaque, le warping sera un peu plus complexe...

    C'est assez visuel, j'espère que cela peut vous aider.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 27
    Par défaut
    Bonjour,

    Tout d'abord merci de votre interêt.
    Je ne suis pas sur d'avoir bien compris la méthode, mais je pense aussi que je me suis mal exprimé :

    Voila où j'en suis

    J'ai une caméra qui me sert notamment à faire des photos d'un livre.
    Un livre ouvert présente une "courbure" que j'aimerais corriger.
    Je projette des lignes horizontales sur le livre, et en fonction de la courbure des lignes (provoquée par la courbure du livre), je veux rectifer la page (la remettre droite).

    Donc je connais la position XY des points des lignes horinzontales quand aucune surface ne se trouve sous ma caméra
    Et je connais la position des points des lignes (incorrectes si courbure) quand la surface est mise sous la caméra.

    Est il possible avec ces 2 tableaux de corriger la deuxieme image pour la remettre droite ?
    En fonction de la différence des coordonées des lignes correctes et "incorrectes", une fonction qui réajuste correctement les pixels sur toute l'image.

    Merci.

  4. #4
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Par défaut
    J'imagine bien la situation que vous présentez.

    Par rapport à mon exemple initial, la projection entre les lignes lumineuses "à plat" et les lignes lumineuses "courbées" n'est pas une homographie.

    La technique qui va remettre à plat votre image reste le warping.

    Pour la mettre en application, vous devez construire une grille à l'aide de vos lignes lumineuses.

    Sur l'image d'origine, vous allez avoir une série de lignes perpendiculaires aux lignes lumineuses, pour former une grille (de ce genre http://www.retinamd.com/images/NormalGrid.jpg).

    Ces mêmes lignes rajoutées sur la photo avec vos lignes lumineuses courbes donne une grille "déformée".

    Si vous connaissez les coordonnées des points de la grille de l'image d'origine et les coordonnées des points de la grille déformée, vous pouvez appliquer un warping entre ces deux ensembles de points.

    Vous pouvez trouver ici du code pour réaliser un morphing : http://davis.wpi.edu/~matt/courses/morph/2d.htm
    L'idée est de récupérer la partie warping du code, par exemple.
    JAI dispose également d'une classe Warp, qui peut être adaptée : http://download.oracle.com/docs/cd/E.../jai/Warp.html
    Un autre exmple en AS : http://www.mukimuki.fr/flashblog/2009/05/10/morphing/

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 27
    Par défaut
    En effet, ça a l'air d'être exactement ce que je recherche !

    Je me mets au travail dès demain pour voir ce que ça donne.

    Par contre, étant donné la méthode, il ne serait pas encore plus simple alors de projeter directement un quadrillage sur la surface ?
    D'en récupérer toutes les intersections (possible avec openCV il me semble) et de réajuster les intersections qui ne se trouvent pas la ou elles doivent être (via le "mesh warping") ?

    J'ai la possibilité de projeter n'importe quelle forme sur la surface à corriger donc ..

    En tous cas je vous remercie et vous tiendrai au courant !

  6. #6
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Par défaut
    Si vous pouvez projeter directement une grille sur vos pages, cela peut effectivement aller encore plus vite. Mais si vous disposez déjà d'images qui n'ont pas profité de la grille, mais seulement de ligne selon un seul axe, ce n'est pas "très" compliqué d'en rajouter "virtuellement".

    A noter que tous les warping réalisés en suivant une triangulation (type delaunay) seront moins précis qu'un warping utilisant une spline. Une spline va reporter les modifications sur un nœud sur plus de points qu'un delaunay.

    IL y a des cas où il est désirable qu'un nœud de la grille qui se déplace n'influence que localement ses voisins (et ne reporte donc pas ses modifications sur l'ensemble de la grille des points), mais dans votre cas précis, la distorsion originale se fait sur une page de livre. Et à moins que votre livre ne soit édité sur du papier de taille A0 (ou sur une feuille de papier bible), une petite torsion ou déformation de la page où qu'elle soit va influencer la géométrie de l'ensemble de la page.

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

Discussions similaires

  1. Taille des surfaces avec DirectDraw
    Par Shakram dans le forum DirectX
    Réponses: 5
    Dernier message: 09/09/2002, 00h42
  2. Effet Fade In / Fade Out sur une surface DirectDraw
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 08/09/2002, 17h37
  3. Sauvegarder une surface dans un fichier
    Par Freakazoid dans le forum DirectX
    Réponses: 6
    Dernier message: 18/08/2002, 15h23
  4. Redimensionnement d'une surface
    Par Freakazoid dans le forum DirectX
    Réponses: 4
    Dernier message: 01/07/2002, 22h01
  5. Opengl -- Les surfaces
    Par Anonymous dans le forum OpenGL
    Réponses: 2
    Dernier message: 02/05/2002, 10h14

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