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
|
void phase_correlation(IplImage*img1,IplImage*img2)
{
IplImage*imf1=cvCreateImage(cvGetSize(img1),IPL_DEPTH_32F,1);
IplImage*dest1=cvCreateImage(cvGetSize(img1),IPL_DEPTH_32F,1);
IplImage*imf2=cvCreateImage(cvGetSize(img2),IPL_DEPTH_32F,1);
IplImage*dest2=cvCreateImage(cvGetSize(img2),IPL_DEPTH_32F,1);
IplImage*C=cvCreateImage(cvGetSize(img1),IPL_DEPTH_32F,1);//là ou on va stocker le rapport des transformées de fourier des deux images
cvConvert(img1,imf1);
cvConvert(img2,imf2);
cvDFT(imf1,dest1,CV_DXT_FORWARD);//trasformée de fourier de l'image de référence
cvDFT(imf2,dest2,CV_DXT_FORWARD);//trasformée de fourier de l'image translatée
cvDiv(dest2,dest1,C);//rapport des transformées de fourier
IplImage*c=cvCreateImage(cvGetSize(C),IPL_DEPTH_32F,1);
cvDFT(C,c,CV_DXT_INVERSE);//transformée de fourier inverse du rapport
CvPoint minloc,maxloc;//points min et max
double minval,maxval;
cvMinMaxLoc(c,&minval,&maxval,&minloc,&maxloc,0);
cout<<"max en ( "<<maxloc.x<<","<<maxloc.y<<") et valeur "<<maxval<<endl;
cout<<"min en ( "<<minloc.x<<","<<minloc.y<<") et valeur "<<minval<<endl;
cvNamedWindow("im1", CV_WINDOW_AUTOSIZE);
cvNamedWindow("im2", CV_WINDOW_AUTOSIZE);
cvShowImage( "im1", img1 );
cvShowImage( "im2", img2 );
cvWaitKey(0);
cvDestroyWindow("im1");
cvDestroyWindow("im2");
cvReleaseImage(&C);
cvReleaseImage(&c);
cvReleaseImage(&imf1);
cvReleaseImage(&imf2);
cvReleaseImage(&dest1);
cvReleaseImage(&dest2);
} |
Partager