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

Calcul scientifique Python Discussion :

Open CV - Homography


Sujet :

Calcul scientifique Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Open CV - Homography
    Avant toute chose bonjour à tous et à toutes.

    Voila, je travaille actuellement sur un projet utilisant OpenCV (j'y étais réfractère de part l'absolu bordel de leur doc .. Mais soit !).


    J'ai besoin de reconnaître sur une image une mire (typiquement une feuille de papier avec un motif particulier) afin de déterminer les déformations de l'image (perspectives et compagnie).

    Mais pourquoi cela ? Afin de rendre à l'image une vision "plane". Concrètement :



    Mon point de vue souffre de perspectives et je voudrai récupérer le plan rouge avec une vision normale à celui-ci. Alors je me dirige vers les homographies et ce cher OpenCV (2.3), au passage je bosse sous Ubuntu 10.04 LTS.

    Le soucis, et c'est là où j'invoque un dieu encore inconnu pour m'aider c'est que la doc est très évasive.Je vous fait un petit résumé de la situation juste en dessous :

    J'ai déterminé les bornes de ma mire (la feuille de papier de couleur) sur l'image (640*480) : ce que je vois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    drawnedCoordinates = [(289, 411), (371, 363), (431, 402), (351, 463)]
    J'associe également des coordonnées de référence (une image 640*480 remplie d'une unique couleur - un rectangle parfait) : ce que je veux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    referenceCoordinates = [(0,0),(640,0),(640,480),(0,480)]
    Après utilisation de la fonction cv2.findHomography (http://www.opencv.org.cn/opencvdoc/2...findHomography) comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (H, mask) = cv2.findHomography(matrixDraw, matrixRef, CV_RANSAC)
    J'obtiens la matrice 3x3 de transformation suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    print H
    [[  2.27475572e-01   5.34531711e-02   2.89000000e+02]
     [  2.22082412e-02   8.46054572e-03   4.11000000e+02]
     [  2.67791298e-04  -2.15707965e-04   1.00000000e+00]]
    Bon, c'est là que tout se complique. Que pouvons-nous diantre faire de cette matrice. Au début, on s'est dit que le père Noel existait (rappelons que je trouve la doc juste imbuvable) et avons essayé naïvement ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    matrixDraw = concatenate((matrixDraw,ones(shape=(4,1))), axis=1)		# Matrix need to be a nx3 array
    result = dot(matrixDraw, H)                                                     # Transformation matrix X Drawned Matrix
    Pour se rendre compte bien rapidement de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    HOMOGRAPHY
    [[  2.27475572e-01   5.34531711e-02   2.89000000e+02]
     [  2.22082412e-02   8.46054572e-03   4.11000000e+02]
     [  2.67791298e-04  -2.15707965e-04   1.00000000e+00]]
    BEFORE
    [[ 289.  411.    1.]
     [ 371.  363.    1.]
     [ 431.  402.    1.]
     [ 351.  463.    1.]]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    AFTER
    [[  7.48682951e+01   1.89250350e+01   2.52443000e+05]
     [  9.24552964e+01   2.29020889e+01   2.56413000e+05]
     [  1.06969952e+02   2.64392404e+01   2.89782000e+05]
     [  9.01266091e+01   2.26790800e+01   2.91733000e+05]]
    EXPECTED
    [[   0.    0.]
     [ 640.    0.]
     [ 640.  480.]
     [   0.  480.]]
    Autrement dit, l'utilité est assez douteuse vu que nous n'avons pas du tout le résultat escompté (voir juste au dessus).

    En fouillant un peu je suis tombé sur ce tuto écrit en C (autre particularité, la pluspart des tuto ne concernent pas la branche Python d'Open CV .. Damned !) : http://opencv.itseez.com/doc/tutoria...omography.html

    Qui conseille après avoir déterminé la matrice d'homographie (ce que nous avons fait plus haut - H) d'utiliser cv2.perspectiveTransform http://www.opencv.org.cn/opencvdoc/2...ctiveTransform

    Pourquoi pas ... Donc si je comprend bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = cv2.perspectiveTransform(matrixDraw, H)
    Devrait me fournir un tableau (ou une matrice comme vous voulez) à laquelle serait appliquée la transformation H déterminée plus haut.

    Et je débouche sur cette erreur (dont je ne comprend pas grand chose en fait).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    result = cv2.perspectiveTransform(matrixDraw, H)
    cv2.error: /home/user/Downloads/OpenCV-2.3.1/modules/core/src/matmul.cpp:1916: error: (-215) scn + 1 == m.cols && (depth == CV_32F || depth == CV_64F) in function perspectiveTransform
    Voici mon cas exposé. J'aimerai donc savoir si l'assistance comprend quelques chose à tout cela, ou si quelqu'un a déjà du utiliser des homographies pour un cas similaire.

    En espérant lire de vos nouvelles très prochainement, bon apétit et bonne journée à vous tous/toutes !

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Problème résolu courant après-midi. Une étape de normalisation semblait nécessaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # Homography application
    matrixDraw = concatenate((matrixDraw,ones(shape=(4,1))), axis=1)			# Matrix need to be a nx3 array
    result = dot(matrixDraw,H.T)								# Multiplication of the target matrix and the 
    norm = result[:,2].reshape(len(matrixDraw),1)						# Normalization coefficient
    result = result[:,:2]/norm								# NormaliZation
    result = result[:,:2]									# Retrieve of the two firts columns (x,y)
    result = around(result, decimals = 2)							# Decimal floor
    Qui donne maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    BEFORE
    [[ 289.  411.]
     [ 371.  363.]
     [ 431.  402.]
     [ 351.  463.]]
    AFTER
    [[   0.    0.]
     [ 640.    0.]
     [ 640.  480.]
     [   0.  480.]]
    EXPECTED
    [[   0.    0.]
     [ 640.    0.]
     [ 640.  480.]
     [   0.  480.]]
    Vous pouvez passer le sujet en [Résolu] messieurs les modérateurs. Bonne journée à tous.

Discussions similaires

  1. Réponses: 16
    Dernier message: 27/05/2017, 10h14
  2. [Kylix] [Kylix 3] Installation version Open
    Par muadib dans le forum EDI
    Réponses: 1
    Dernier message: 14/03/2003, 16h37
  3. Réponses: 5
    Dernier message: 24/11/2002, 11h36
  4. [Kylix] Télécharger Kylix 3 Open Edition
    Par RDM dans le forum EDI
    Réponses: 2
    Dernier message: 27/08/2002, 11h28
  5. Choix d'un EDI pour la 3D (Open GL, Portable)
    Par Riko dans le forum OpenGL
    Réponses: 6
    Dernier message: 01/08/2002, 12h25

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