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 !