Correction de perspective en C
Bonjour,
je m'efforce de suivre ce tutoriel afin de corriger la perspective d'une image, seulement, après avoir galéré 6 heures, et avoir une inversion et une multiplication de matrices fonctionnelles (l84 à 131), je fais la dernière étape de l'algorithme (trouver chaque pixel (X,Y) dans ma nouvelle matrice à l'aide des coefficient trouvés grace à la multiplication de matrice (dans le lien ils écrivent 3 matrices en disant: AB = C, et je retrouve B en disant B = A^-1*C)
Seulement, après avoir sauvegardé mon image, cela donne le résultat incroyable en annexe...
Je vous avoue que je suis un peut à bout, j'ai tout revérifié, j'envoie les bons coordonnées en entier, mes fonctions de création de la matrice de 8*8, d'inversion de matrice et de multiplications de matrices fonctionnent, car je les ai testées, et elles renvoient les même résultats que les inverseurs de matrice en ligne (j'ai effectué 4 tests)...
Je vous implore à l'aide car je dois terminer ceci d'ici 3 jours (on se laisse avec mon groupe 2 semaines et demie de marge pour l'assemblage et les corrections, au cas où il y aurait des problèmes, ou que la fin de semestre serait chargée...)
Merci d'avance.
PS: je sais que tout mon code est dans mon main, et que je ne peux pas l'appeler avec des arguments, pour l'instant je m'occupe de faire un code fonctionnel.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
| #include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <unistd.h>
#include <SDL2/SDL.h>
#include <string.h>
//#include "tools/bin/resize.h"
//#include "separator/separator.h"
#include "binarization/binarize.h"
#include "SDL_Manager/import-export.h"
#include "skew/skew.h"
//Safety test env
#ifndef ENV_TEST
double abse(double x){
if (x < 0)
return -x;
return x;
}
double lemax(double x, double y){
if (x > y)
return x;
else
return y;
}
double lemin(double x, double y){
if (x < y)
return x;
else
return y;
}
int main(int argc, char ** argv)
{
double * ptdr = NULL;
ptdr = malloc(8*sizeof(double));
ptdr[0] = 37;
ptdr[1] = 381;
ptdr[2] = 647;
ptdr[3] = 441;
ptdr[4] = 115;
ptdr[5] = 1219;
ptdr[6] = 787;
ptdr[7] = 1200;
int l = 8;
double * boardg = NULL;
boardg = malloc(l * l * sizeof(double));
double * inv = NULL;
inv = malloc(l * l * sizeof(double));
for(int i = 0;i<l*l;i++){
if (i%(l+1) == 0)
inv[i] = 1;
else
inv[i] = 0;
}
for(int i = 0;i<l*l;i++)
boardg[i] = 0;
for(int i = 0;i<4;i++){
boardg[l*i] = boardg[l*(i+4)+3] = boardg[l*i+6] = boardg[l*(i+4)+6] = ptdr[2*i];
boardg[l*i+1] = boardg[l*(i+4)+4] = boardg[l*i+7] = boardg[l*(i+4)+7] = ptdr[2*i+1];
boardg[l*i+2] = boardg[l*(i+4)+5] = 1;
}//*/
ptdr[0] = ptdr[4] = lemin(ptdr[0],ptdr[4]);
ptdr[1] = ptdr[3] = lemin(ptdr[1],ptdr[3]);
ptdr[2] = ptdr[6] = lemax(ptdr[2],ptdr[6]);
ptdr[7] = ptdr[5] = lemax(ptdr[7],ptdr[5]);
for(int i = 0;i<4;i++){
boardg[l*i+6] *= -1 * ptdr[2*i];
boardg[l*i+7] *= -1 * ptdr[2*i];
boardg[l*(i+4)+6] *= -1 * ptdr[2*i+1];
boardg[l*(i+4)+7] *= -1 * ptdr[2*i+1];
}
/*
for(int i = 0; i < l*l;i++){
if (i %l == 0)
printf("\n");
printf(" %f ,",boardg[i]);
} //*/
//Calcul inverse
int r = -1;
for (int j = 0; j < l;j++){
int k = r+1;
for(int i = k;i< l;i++){
if (abse(boardg[l*i + j]) > abse(boardg[l*k + j]))
k = i;
}
if (boardg[l*k+j] != 0){
r += 1;
double divisor = boardg[k*l+j];
for(int i = 0; i < l;i++){
boardg[k*l+i] /= divisor;
inv[k*l+i] /= divisor;
}
if (k != r){
for(int i = 0; i < l;i++){
double tmp = boardg[r*l+i];
boardg[r*l+i] = boardg[k*l+i];
boardg[k*l+i] = tmp;
double tmp2 = inv[r*l+i];
inv[r*l+i] = inv[k*l+i];
inv[k*l+i] = tmp2;
}
}
for (int i = 0; i < l;i++){
if (i != r){
double tmp = boardg[i*l+j];
for (int wow = 0; wow < l;wow++){
boardg[i*l+wow] -= boardg[r*l+wow] * tmp;
inv[i*l+wow] -= inv[r*l+wow] * tmp;
}
}
}
}
} //*/
//Multiplication matrice
double res[l];
for (int i=0;i<l;i++){
res[i] = 0;
for(int j = 0;j<l;j++){
res[i] += inv[l*i+j] * ptdr[j];
}
//printf("%f\n",ptdr[i]);
printf("%f\n",res[i]);
}
//Initialisation SDL
printf("\nui\n");
int x;
int * px = &x;
int y;
int * py = &y;
SDL_Surface * image = load_image("ANT.BMP", px, py);
Uint8 * board3 = NULL;
board3 = malloc(x * y * sizeof(Uint8));
gray(image,board3);
Uint8 * board2 = NULL;
board2 = malloc(x * y * sizeof(Uint8));
//Application nouvelles coordonnées
for(Uint16 i = 0; i < x;i++){
for(Uint16 j = 0; j < y;j++){
int ppx = (int) ((res[0]*i+res[1]*j+res[2])/(res[6]*i+res[7]*j+1));
int ppy = (int) ((res[3]*i+res[4]*j+res[5])/(res[6]*i+res[7]*j+1));
if (ppy>0 && ppy < y && ppx >0 && ppx < x)
board2[j*x + i] = board3[ppy*x+ppx];
}
}
save(board2,x,y,"/home/user/Bureau/ocr/src/main/c/oui.bmp");
printf("\nChaussette\n\n");
free(board3);
free(board2);
free(boardg);
free(ptdr);
return 0;
}
#endif |
Entrée:
https://media.discordapp.net/attachm...83/unknown.png
Résultat:
https://media.discordapp.net/attachm...50/unknown.png