Пример #1
0
static void ApplyInPlaceFourierTransform( GenericImage<P>& image, FFTDirection::value_type dir, bool parallel, int maxProcessors )
{
   int w = FFTC::OptimizedLength( image.Width() );
   int h = FFTC::OptimizedLength( image.Height() );

   if ( w != image.Width() || h != image.Height() )
   {
      StatusCallback* s = image.GetStatusCallback(); // don't update status here
      image.SetStatusCallback( 0 );
      image.ShiftToCenter( w, h );
      image.SetStatusCallback( s );
   }

   bool statusInitialized = false;
   if ( image.Status().IsInitializationEnabled() )
   {
      image.Status().Initialize( (dir == FFTDirection::Backward) ? "Inverse FFT" : "FFT",
                                 image.NumberOfSelectedChannels()*size_type( w + h ) );
      image.Status().DisableInitialization();
      statusInitialized = true;
   }

   try
   {
      FFTC F( h, w, image.Status() );
      F.EnableParallelProcessing( parallel, maxProcessors );
      for ( int c = image.FirstSelectedChannel(); c <= image.LastSelectedChannel(); ++c )
         F( image[c], image[c], (dir == FFTDirection::Backward) ? PCL_FFT_BACKWARD : PCL_FFT_FORWARD );
      if ( statusInitialized )
         image.Status().EnableInitialization();
   }
   catch ( ... )
   {
      if ( statusInitialized )
         image.Status().EnableInitialization();
      throw;
   }
}