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.
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.
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 :
(H, mask) = cv2.findHomography(matrixDraw, matrixRef, CV_RANSAC)
J'obtiens la matrice 3x3 de transformation suivante :
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 :
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 :
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.]] |
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 :
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).
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 !
Partager