bonjour!j ai écri un petit program de detection de changement entre 2 images basé sur le calcule de la variance des rapports dans des régions [skifstad89]
mon program:
double var(IplImage*img,IplImage*def,int x,int y)
{ int i,j;
int n=1;
int nb=((2*n)+1)*((2*n)+1);
CvScalar vimg,vdef;
double moy=0,rapport;
double variance=0;
for(i=-n;i<=n;i++)
{
for(j=-n;j<=n;j++)
{
vimg=cvGet2D(img,y+i,x+j);
vdef=cvGet2D(def,y+i,x+j);
rapport=vimg.val[0]/vdef.val[0];
moy=moy+rapport;
}
}
moy=moy/nb;
for(i=-n;i<=n;i++)
{
for(j=-n;j<=n;j++)
{
vimg=cvGet2D(img,y+i,x+j);
vdef=cvGet2D(def,y+i,x+j);
rapport=vimg.val[0]/vdef.val[0];
rapport=rapport-moy;
rapport=rapport*rapport;
variance=variance+rapport;
}
}
variance=variance/nb;
return(variance);
}
void skifstad_detection(IplImage*img,IplImage*def,IplImage*obs)
{
int i ,j;
CvScalar blanc,noir;
blanc.val[0]=255;
noir.val[0]=0;
double seuille=0.05;
for(i=0;i<obs->height;i++)
{
for(j=0;j<obs->width;j++)
{
cvSet2D(obs,i,j,blanc);
}
}
for(i=4;i<obs->height-4;i++)
{
for(j=4;j<obs->width-4;j++)
{
if(var(img,def,j,i)>seuille )
cvSet2D(obs,i,j,noir);
}
}
cvNamedWindow( "obstacle", 1 );
cvShowImage("obstacle", obs);
cvWaitKey(0);
}
j ai testé mon program sur une paire(les images son en piece jointe) que j ai obtenu a partir d'un fichier pdf mais j ai pas obtenu le resultat attendu!!!quelqu ' un a une idée sur mon probleme ?
l'image mon resultat.jpg représente le resultat de mon program appliqué sur la paire ( img1.jpg , img2.jpg)
l'image bon resultat.jpg représente le résultat que je veux obtenir que j ai trouvé dans le meme fichier pdf .
merci d avance pour votre aide.
Partager