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 :

[Algorithmique] Adapter une texture triangulaire avec warpPerspective


Sujet :

OpenCV

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 38
    Par défaut [Algorithmique] Adapter une texture triangulaire avec warpPerspective
    Bonjour,

    Dans le cadre de mon projet, je dois réaliser une méthode qui redimensionne un triangle (ce sera toujours un triangle) en un autre triangle de taille et de forme différente.

    Mon problème se situe au niveau de la transformation de la texture (image) contenu dans ce triangle. Comment l'adapter pour qu'elle remplisse complètement mon nouveau triangle. Existe-il des méthodes incluses avec openCV pour réaliser cette opération ?

    J'utilise openCV (2.4) en C++ (VS 2010), actuellement (peut être changé) j'ai une class qui stock mes triangles (en fait, j'en ai beaucoup, ils forment un mesh et sont créé par Delaunay).
    Le stockage est sous cette forme :
    std::vector<cv:: Point> sommets
    cv::Mat image;
    cv::Mat mask;

    mon mask est en réalité le triangle (binaire), mon cv::Mat image contient la texture "découpé" dans mon image d'origine selon le mask. Cette image (ainsi que le mask) fait la taille du triangle inscrit dans un rectangle.

    Voici l'action à réaliser en schéma :


    Donc j'ai les 2 points jaunes qui sont fixes (et donc naturellement la droite verte aussi) et je déplace le points bleu. Mon objectif est de transformer ma texture initiale (ici un dégradé pour faciliter la compréhension) pour l'adapter au nouveau triangle.
    Le cadre gris est mon cv::Mat tel qu'il sera stocké.

    Merci.
    Images attachées Images attachées  

  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
    Une petite réponse rapide (je suis en retard ) : regarde du côté de la fonction cvWarpPerspective().

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 38
    Par défaut
    Merci,

    effectivement, en affinant mes recherches j'ai pu voir que mon problème pouvait se résoudre en exploitant les perspectives.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
    La question c'est comment choisir la matrice 3x3 M correspondant à ma transformation (j'ai plein de transformations à opérer, toutes différentes).

    Le tout en connaissant les 3 points formant le triangle initial, les 3 points du triangle destination, la taille des rectangles englobant de chacun des 2 triangles (la transformation s'applique nécessairement sur les rectangles englobants).

    Je ne serais pas contre un petit exemple (si possible).

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 38
    Par défaut
    c'est bon j'ai trouvé
    Pour ceux que ça intéresse :

    il faut récupérer 4 points dans l'image source et leur correspondance dans l'image modifié.
    Pour mon cas, j'ai donc pris : les 3 sommets des triangles + leur centre de gravité

    je stock ces 4 points dans un pour l'image originale
    et pour l'image résultante.

    puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cv::warpPerspective(img, img, cv::getPerspectiveTransform(src, dst), size, cv::INTER_CUBIC);
    où size est un cv::Size correspondant à la taille désirée pour le rectangle de destination (qui deviendra la nouvelle taille de img).

    Attention : il faut que les points de dst soient exprimé dans le repère de "size" et non de img.size() !

    Pour preuve que ça marche, en PJ l'image originale et après traitement.

    Code complet dispo par mp.
    Images attachées Images attachées   

  5. #5
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Par défaut
    @supernovagm : félicitations !

    Une petite astuce : indiquer "code complet par MP" va peut-être être pénible dans 1 an ou 2 quand des gens vont débarquer sur le forum après une recherche google et envoyer des messages pour jeter un coup d'oeil au code. C'est peut-être intéressant dans ce cas de créer un repository sur github ou googlecode et d'y placer le code, tout en ajoutant l'URL ici.

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 38
    Par défaut
    Ok.

    dispo également ici : https://code.google.com/p/warp-persp...downloads/list
    Me contact par mp uniquement si le lien est invalide, avec le nom et le lien de ce topic.

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

Discussions similaires

  1. [DirectX 9] creer une Texture Atlas avec Directx9
    Par mbousoli dans le forum DirectX
    Réponses: 1
    Dernier message: 14/06/2015, 17h07
  2. Générer une texture simple avec DirectX
    Par Patsux dans le forum DirectX
    Réponses: 4
    Dernier message: 08/03/2013, 07h18
  3. Directx 8 Probleme avec setrenderTarget pour un rendu du monde sur une texture
    Par zerailkiller dans le forum Développement 2D, 3D et Jeux
    Réponses: 7
    Dernier message: 14/01/2007, 13h50
  4. Réponses: 5
    Dernier message: 20/02/2006, 17h49
  5. comment faire un sphère avec une texture ?
    Par fregate dans le forum OpenGL
    Réponses: 1
    Dernier message: 12/09/2005, 03h37

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