「fftwandopencv」の編集履歴(バックアップ)一覧はこちら

fftwandopencv」(2008/10/31 (金) 10:26:07) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

//cpp /** * @brief basic form of fftw with opencv */ #include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h> #define _USE_MATH_DEFINES #include "math.h" #include "fftw3.h" #pragma comment( lib, "cv.lib" ) #pragma comment( lib, "cxcore.lib" ) #pragma comment( lib, "highgui.lib" ) #pragma comment( lib, "fftw3.lib" ) #define SIZEX 128 #define SIZEY 64 int maGetPowerSpectol2D( IplImage *src, IplImage *dst ); int maShiftOrigin2D( IplImage *src, IplImage *dst ); int main( void ) { IplImage *img = NULL; // image for data manipulation IplImage *out = NULL; // image for result visualization fftw_complex *data = NULL; fftw_plan plan= NULL; CvScalar tmp; int i,j; data = (fftw_complex*)fftw_malloc( sizeof(fftw_complex) * SIZEX * SIZEY ); img = cvCreateImageHeader( cvSize( SIZEX, SIZEY ), IPL_DEPTH_64F, 2 ); img->imageData = (char*)data; for( j=0; j<SIZEY; j++ ){ for( i=0; i<SIZEX; i++ ){ tmp = cvScalar( 1 + 2*sin(2*M_PI*i/SIZEX) + 4*sin(4*M_PI*j/SIZEY), 0 ); cvSet2D( img, j, i, tmp ); } } plan = fftw_plan_dft_2d( SIZEY, SIZEX, data, data, FFTW_FORWARD, FFTW_ESTIMATE ); fftw_execute( plan ); out = cvCreateImage( cvSize( SIZEX, SIZEY ), IPL_DEPTH_8U, 1 ); maGetPowerSpectol2D( img, out ); maShiftOrigin2D( out, out ); cvNamedWindow( "result" ); cvShowImage( "result", out ); cvWaitKey( 0 ); cvDestroyWindow( "result" ); if( plan ) fftw_destroy_plan( plan ); if( out ) cvReleaseImage( &out ); if( img ) cvReleaseImageHeader( &img ); if( data ) fftw_free( data ); return true; } /* * Get the powerspectol * src must be IPL_DEPTH_64F(double), dst must be IPL_DEPTH_8U(unsigned char) * @param src source image * @param dst destination image */ int maGetPowerSpectol2D( IplImage *src, IplImage *dst ) { IplImage *re = NULL; IplImage *im = NULL; CvSize size; double max,min; size = cvGetSize( src ); re = cvCreateImage( size, IPL_DEPTH_64F, 1 ); im = cvCreateImage( size, IPL_DEPTH_64F, 1 ); // get the powerspectol : log( 1 + sqrt(re*re+im*im) ) cvSplit( src, re, im, NULL, NULL ); cvPow( re, re, 2.0 ); cvPow( im, im, 2.0 ); cvAdd( re, im, re ); cvPow( re, re, 0.5 ); cvAddS( re, cvScalarAll(1.0), re ); cvLog( re, re ); // scailing to 0-255 cvMinMaxLoc( re, &min, &max ); cvScale( re, re, 1.0 / (max - min), 1.0 * (-min) / (max - min ) ); cvConvertScale( re, dst, 255 ); if( re ) cvReleaseImage( &re ); if( im ) cvReleaseImage( &im ); return true; } /* * Shift axis origin ( FFT result, and so on ) * This function applies for both in-place and out-place transform. * Input and Output takes any size, channel, depth. They have only to be the same size, channel, depth * @param src source image * @param dst destination image */ int maShiftOrigin2D( IplImage *src, IplImage *dst ) { int cx, cy; CvMat *tmp = NULL; CvMat q1stub, q2stub; CvMat q3stub, q4stub; CvMat d1stub, d2stub; CvMat d3stub, d4stub; CvMat *q1, *q2, *q3, *q4; CvMat *d1, *d2, *d3, *d4; CvSize size = cvGetSize (src); CvSize dst_size = cvGetSize (dst); if (src == dst) tmp = cvCreateMat (size.height/2, size.width/2, cvGetElemType (src) ); cx = size.width / 2; cy = size.height / 2; q1 = cvGetSubRect (src, &q1stub, cvRect (0, 0, cx, cy)); q2 = cvGetSubRect (src, &q2stub, cvRect (cx, 0, cx, cy)); q3 = cvGetSubRect (src, &q3stub, cvRect (cx, cy, cx, cy)); q4 = cvGetSubRect (src, &q4stub, cvRect (0, cy, cx, cy)); d1 = cvGetSubRect (dst, &d1stub, cvRect (0, 0, cx, cy)); d2 = cvGetSubRect (dst, &d2stub, cvRect (cx, 0, cx, cy)); d3 = cvGetSubRect (dst, &d3stub, cvRect (cx, cy, cx, cy)); d4 = cvGetSubRect (dst, &d4stub, cvRect (0, cy, cx, cy)); if (src != dst) { cvCopy (q3, d1, 0); cvCopy (q4, d2, 0); cvCopy (q1, d3, 0); cvCopy (q2, d4, 0); } else { cvCopy (q3, tmp, 0); cvCopy (q1, q3, 0); cvCopy (tmp, q1, 0); cvCopy (q4, tmp, 0); cvCopy (q2, q4, 0); cvCopy (tmp, q2, 0); } if( tmp ) cvReleaseMat( &tmp ); return true; }
//cpp /** * @brief basic form of fftw with opencv */ #include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h> #define _USE_MATH_DEFINES #include "math.h" #include "fftw3.h" #pragma comment( lib, "cv.lib" ) #pragma comment( lib, "cxcore.lib" ) #pragma comment( lib, "highgui.lib" ) #pragma comment( lib, "fftw3.lib" ) #define SIZEX 128 #define SIZEY 64 int maGetPowerSpectol2D( IplImage *src, IplImage *dst ); int maShiftOrigin2D( IplImage *src, IplImage *dst ); int main( void ) { IplImage *img = NULL; // image for data manipulation IplImage *out = NULL; // image for result visualization fftw_complex *data = NULL; fftw_plan plan= NULL; CvScalar tmp; int i,j; data = (fftw_complex*)fftw_malloc( sizeof(fftw_complex) * SIZEX * SIZEY ); img = cvCreateImageHeader( cvSize( SIZEX, SIZEY ), IPL_DEPTH_64F, 2 ); img->imageData = (char*)data; for( j=0; j<SIZEY; j++ ){ for( i=0; i<SIZEX; i++ ){ tmp = cvScalar( 1 + 2*sin(2*M_PI*i/SIZEX) + 4*sin(4*M_PI*j/SIZEY), 0 ); cvSet2D( img, j, i, tmp ); } } plan = fftw_plan_dft_2d( SIZEY, SIZEX, data, data, FFTW_FORWARD, FFTW_ESTIMATE ); fftw_execute( plan ); out = cvCreateImage( cvSize( SIZEX, SIZEY ), IPL_DEPTH_8U, 1 ); maGetPowerSpectol2D( img, out ); maShiftOrigin2D( out, out ); cvNamedWindow( "result" ); cvShowImage( "result", out ); cvWaitKey( 0 ); cvDestroyWindow( "result" ); if( plan ) fftw_destroy_plan( plan ); if( out ) cvReleaseImage( &out ); if( img ) cvReleaseImageHeader( &img ); if( data ) fftw_free( data ); return true; } /* * Get the powerspectol * src must be IPL_DEPTH_64F(double), dst must be IPL_DEPTH_8U(unsigned char) * @param src source image * @param dst destination image */ int maGetPowerSpectol2D( IplImage *src, IplImage *dst ) { IplImage *re = NULL; IplImage *im = NULL; CvSize size; double max,min; size = cvGetSize( src ); re = cvCreateImage( size, IPL_DEPTH_64F, 1 ); im = cvCreateImage( size, IPL_DEPTH_64F, 1 ); // get the log scaled powerspectol : log( 1 + sqrt(re*re+im*im) ) cvSplit( src, re, im, NULL, NULL ); cvPow( re, re, 2.0 ); cvPow( im, im, 2.0 ); cvAdd( re, im, re ); cvPow( re, re, 0.5 ); cvAddS( re, cvScalarAll(1.0), re ); cvLog( re, re ); // scailing to 0-255 cvMinMaxLoc( re, &min, &max ); cvScale( re, re, 1.0 / (max - min), 1.0 * (-min) / (max - min ) ); cvConvertScale( re, dst, 255 ); if( re ) cvReleaseImage( &re ); if( im ) cvReleaseImage( &im ); return true; } /* * Shift axis origin ( FFT result, and so on ) * This function applies for both in-place and out-place transform. * Input and Output takes any size, channel, depth. They have only to be the same size, channel, depth * @param src source image * @param dst destination image */ int maShiftOrigin2D( IplImage *src, IplImage *dst ) { int cx, cy; CvMat *tmp = NULL; CvMat q1stub, q2stub; CvMat q3stub, q4stub; CvMat d1stub, d2stub; CvMat d3stub, d4stub; CvMat *q1, *q2, *q3, *q4; CvMat *d1, *d2, *d3, *d4; CvSize size = cvGetSize (src); CvSize dst_size = cvGetSize (dst); if (src == dst) tmp = cvCreateMat (size.height/2, size.width/2, cvGetElemType (src) ); cx = size.width / 2; cy = size.height / 2; q1 = cvGetSubRect (src, &q1stub, cvRect (0, 0, cx, cy)); q2 = cvGetSubRect (src, &q2stub, cvRect (cx, 0, cx, cy)); q3 = cvGetSubRect (src, &q3stub, cvRect (cx, cy, cx, cy)); q4 = cvGetSubRect (src, &q4stub, cvRect (0, cy, cx, cy)); d1 = cvGetSubRect (dst, &d1stub, cvRect (0, 0, cx, cy)); d2 = cvGetSubRect (dst, &d2stub, cvRect (cx, 0, cx, cy)); d3 = cvGetSubRect (dst, &d3stub, cvRect (cx, cy, cx, cy)); d4 = cvGetSubRect (dst, &d4stub, cvRect (0, cy, cx, cy)); if (src != dst) { cvCopy (q3, d1, 0); cvCopy (q4, d2, 0); cvCopy (q1, d3, 0); cvCopy (q2, d4, 0); } else { cvCopy (q3, tmp, 0); cvCopy (q1, q3, 0); cvCopy (tmp, q1, 0); cvCopy (q4, tmp, 0); cvCopy (q2, q4, 0); cvCopy (tmp, q2, 0); } if( tmp ) cvReleaseMat( &tmp ); return true; }

表示オプション

横に並べて表示:
変化行の前後のみ表示: