vérification des erreurs d'un code C++
Bonjour tous le monde; j'ai un petit code en Matlab extrait d'un programme de segmentation d'image par le modèle de Ron Kimmel)
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
| % 'Roughly' correct Phi to be a distance map of its zero set
function u=redistance(Phi);
u=(sign(Phi)+1)*999999; % set to infinity all positive
for i=1:2,
l2=2;
if i>1
u=(1-sign(Phi))*999999;
end % set to infinity all negative
while l2>1,
v=Update(u,1);
l2=sum(sum((u-v).^2));
u=v;;
end % while
if i>1
u=u-up;
else
up=u;
end % if
end % for
%-----------------------------------------------------------------------------------------------
%Solve |grad u|=F(x,y) parallel version of the FMM
function res=Update(u,F)
mx=min(u([2:end end],:), u([1 1:end-1],:));
my= min(u(:,[2:end end]), u(:,[1 1:end-1]));
delm=(mx-my);
mask=(abs(delm)<F);
res=min(mask.*(mx+my+sqrt(2.*F.^2-delm.^2))./2+...
(1-mask).*(min(mx,my)+F),u); |
tel que "phi" une matrice carré quelconque.
j'ai essayer de convertir ce code en C++ Builder (manuellement), mais je ne sais pas si je suis juste ou non, alors s'il y a quelqu'un qui peuvent m'aider je le remercie d'avance.
voici le code que j'ai écrit:
pour la fonction "redistance"
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
| void __fastcall TForm1::redistance(float **phi, int H, int W)
{
float**up=new float*[H]; // la heuteur de l'image
for(int i=0;i<H;i++)
{
up[i]=new float[W]; // la largeur de l'image
}
float**v=new float*[H];
for(int i=0;i<H;i++)
{
v[i]=new float[W];
}
float l2, l22;
for (int i=0;i<H;i++)
for (int j=0;j<W;j++)
{
phi[i][j]=(fctsign(phi[i][j])+1)*999999; // fixé le tous positif
}
for (int z=1;z<3;z++)
{
l2=2;
if (z>1)
{
for (int i=0;i<H;i++)
for (int j=0;j<W;j++)
{
phi[i][j]=(1-fctsign(phi[i][j]))*999999; //fixé le tous négative
}
} // end if
while (l2>1)
{
Updt(phi,v,H,W); // fonction update
l22=0;
for (int i=1;i<H-1;i++)
for (int j=1;j<W-1;j++)
{
l22=l22+pow((phi[i][j]-v[i][j]),2);
}
l2=l22;
for (int i=1;i<H-1;i++)
for (int j=1;j<W-1;j++)
{
phi[i][j]=v[i][j];
}
} // end while
if (z>1)
{
for (int i=0;i<H;i++)
for (int j=0;j<W;j++)
{
phi[i][j]=phi[i][j]-up[i][j];
}
}
else
{
for (int i=0;i<H;i++)
for (int j=0;j<W;j++)
{
up[i][j]=phi[i][j];
}
}
}// end for z
for (int i=0;i<H;i++)
delete[]up[i];
delete[]up;
for (int i=0;i<H;i++)
delete[]v[i];
delete[]v;
} |
et pour la fonction "Update ":
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
| void __fastcall TForm1::Updt(float **u,float **v, int H, int W)
{
float mx,my,diff,minimum;
//Résoudre l'équation |grad u|=F(x,y)
// déclaration de la matrice mask
float**mask=new float*[H];
for(int i=0;i<H;i++)
{
mask[i]=new float[W];
}
// déclaration de la matrice produit
float**produit=new float*[H];
for(int i=0;i<H;i++)
{
produit[i]=new float[W];
}
for (int i=1;i<H-1;i++)
for (int j=1;j<W-1;j++)
{
my=min(u[i][j+1],u[i][j-1]);
mx=min(u[i+1][j],u[i-1][j]);
minimum=min(mx,my);
diff=mx-my;
if (abs(diff)<1) // abs(mx-my)<1
{
mask[i][j]=1;
produit[i][j]=mask[i][j]*((mx+my+sqrt(2-(diff*diff)))/(2+((1-mask[i][j])*(minimum+1))));
}
else
{
mask[i][j]=0;
produit[i][j]=0;
}
}
for (int i=1;i<H-1;i++)
for (int j=1;j<W-1;j++)
{
v[i][j]=min(produit[i][j],u[i][j]);
}
// Libération de mémoire
for(int i=0;i<H;i++)
delete[]mask[i];
delete[]mask;
for(int i=0;i<H;i++)
delete[]produit[i];
delete[]produit;
} |
et s'il y a des fautes merci de bien les signalées.