From 70ec82a6a6b1ae40dbbd55b8cfcb86ac0a879ae4 Mon Sep 17 00:00:00 2001 From: "N.N." Date: Thu, 18 Jun 2009 12:48:00 +0000 Subject: fix memory link + phase svn path=/trunk/externals/pdp_opencv/; revision=11798 --- pdp_opencv_dft-help.pd | 13 +++++++++++-- pdp_opencv_dft.c | 24 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/pdp_opencv_dft-help.pd b/pdp_opencv_dft-help.pd index b8550f2..2e9efab 100755 --- a/pdp_opencv_dft-help.pd +++ b/pdp_opencv_dft-help.pd @@ -53,9 +53,9 @@ #X msg 518 -49 0; #X obj -189 109 cnv 15 880 150 empty empty empty 20 12 0 14 -258113 -66577 0; -#X obj -53 212 pdp_opencv_dft; +#X obj -58 192 pdp_opencv_dft; #X obj 215 206 pdp_opencv_dft; -#X msg -25 178 bang; +#X msg -30 158 bang; #X msg 206 175 bang; #X obj 114 140 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; @@ -129,6 +129,12 @@ #X text 505 449 this test pad should turn red; #X obj 151 357 > 5; #X obj 114 164 metro 100; +#X obj 29 222 pdp_spigot; +#X obj 30 241 pdp_xv; +#X obj 94 200 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 +1; +#X text 106 230 <-- also outputs phase diagram; +#X text 110 240 ( necessary for reverse dft ); #X connect 1 0 2 0; #X connect 2 0 4 0; #X connect 3 0 4 0; @@ -168,6 +174,7 @@ #X connect 42 0 35 0; #X connect 45 0 44 0; #X connect 47 0 63 0; +#X connect 47 1 85 0; #X connect 48 0 62 0; #X connect 49 0 47 0; #X connect 50 0 48 0; @@ -188,3 +195,5 @@ #X connect 83 0 76 1; #X connect 84 0 47 0; #X connect 84 0 48 0; +#X connect 85 1 86 0; +#X connect 87 0 85 1; diff --git a/pdp_opencv_dft.c b/pdp_opencv_dft.c index 59d9f57..4570eaa 100755 --- a/pdp_opencv_dft.c +++ b/pdp_opencv_dft.c @@ -40,6 +40,7 @@ typedef struct pdp_opencv_dft_struct t_outlet *x_outlet1; int x_packet0; int x_packet1; + int x_packet2; int x_dropped; int x_queue_id; @@ -119,6 +120,7 @@ void pdp_opencv_dft_shift_dft(CvArr * src_arr, CvArr * dst_arr ) cvCopy(q2, q4, 0); cvCopy(tmp, q2, 0); } + cvReleaseMat( &tmp ); } static void pdp_opencv_dft_process_rgb(t_pdp_opencv_dft *x) @@ -127,6 +129,8 @@ static void pdp_opencv_dft_process_rgb(t_pdp_opencv_dft *x) short int *data = (short int *)pdp_packet_data(x->x_packet0); t_pdp *newheader = pdp_packet_header(x->x_packet1);; short int *newdata = (short int *)pdp_packet_data(x->x_packet1);; + t_pdp *phaseheader = pdp_packet_header(x->x_packet2);; + short int *phasedata = (short int *)pdp_packet_data(x->x_packet2);; CvMat tmp; double m,M; int px,py; @@ -196,6 +200,16 @@ static void pdp_opencv_dft_process_rgb(t_pdp_opencv_dft *x) // Split Fourier in real and imaginary parts cvSplit( x->dft_A, x->image_re, x->image_im, 0, 0 ); + // calculate phase + for( py=0; pyimage_re->height; py++ ) { + double* ptrr = (double*) ( x->image_re->imageData + py * x->image_re->widthStep); + double* ptri = (double*) ( x->image_im->imageData + py * x->image_im->widthStep); + float* ptrp = (float*) ( x->image_pout->imageData + py * x->image_pout->widthStep); + for( px=0; pximage_re->width; px++ ) { + (*(ptrp+px)) = cvFastArctan( (float)*(ptri+px), (float)*(ptrr+px) ); + } + } + // Compute the magnitude of the spectrum Mag = sqrt(Re^2 + Im^2) cvPow( x->image_re, x->image_re, 2.0); cvPow( x->image_im, x->image_im, 2.0); @@ -228,6 +242,8 @@ static void pdp_opencv_dft_process_rgb(t_pdp_opencv_dft *x) cvCvtColor(x->image_mout, x->image, CV_GRAY2RGB); memcpy( newdata, x->image->imageData, x->x_size*3 ); + cvCvtColor(x->image_pout, x->image, CV_GRAY2RGB); + memcpy( phasedata, x->image->imageData, x->x_size*3 ); return; } @@ -240,6 +256,12 @@ static void pdp_opencv_dft_sendpacket(t_pdp_opencv_dft *x) /* unregister and propagate if valid dest packet */ pdp_packet_pass_if_valid(x->x_outlet0, &x->x_packet1); + + /* unregister and propagate if valid dest packet */ + pdp_packet_pass_if_valid(x->x_outlet1, &x->x_packet2); + + pdp_packet_mark_unused(x->x_packet1); + pdp_packet_mark_unused(x->x_packet2); } static void pdp_opencv_dft_process(t_pdp_opencv_dft *x) @@ -256,6 +278,7 @@ static void pdp_opencv_dft_process(t_pdp_opencv_dft *x) case PDP_BITMAP_RGB: x->x_packet1 = pdp_packet_clone_rw(x->x_packet0); + x->x_packet2 = pdp_packet_clone_rw(x->x_packet0); pdp_queue_add(x, pdp_opencv_dft_process_rgb, pdp_opencv_dft_sendpacket, &x->x_queue_id); break; @@ -321,6 +344,7 @@ void *pdp_opencv_dft_new(t_floatarg f) x->x_packet0 = -1; x->x_packet1 = -1; + x->x_packet2 = -1; x->x_queue_id = -1; x->x_width = 320; -- cgit v1.2.1