00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include "CUDA/CudaImage.H"
00040 #include "CUDA/CudaMathOps.H"
00041 #include "Util/Assert.H"
00042 #include "CUDA/cudadefs.h"
00043 #include "CudaKernels.H"
00044 #include "CudaDevices.H"
00045 #include "wrap_c_cuda.h"
00046
00047
00048
00049 CudaImage<float> cudaDogFilterHmax(MemoryPolicy mp, int dev, const float theta, const float gamma, const int size, const float div)
00050 {
00051
00052 ASSERT(mp != HOST_MEMORY);
00053
00054
00055 CudaImage<float> dest(size, size, NO_INIT,mp,dev);
00056 Dims tile = CudaDevices::getDeviceTileSize(dev);
00057 cuda_c_dogFilterHmax(dest.getCudaArrayPtr(), theta, gamma, size, div, tile.w(),tile.h());
00058 return dest;
00059 }
00060
00061 CudaImage<float> cudaDogFilter(MemoryPolicy mp, int dev, const float stddev, const float theta, const int halfsize_in)
00062 {
00063
00064 ASSERT(mp != HOST_MEMORY);
00065
00066
00067 int halfsize = halfsize_in;
00068 if (halfsize <= 0) halfsize = int(ceil(stddev * sqrt(7.4F)));
00069 int size = 2*halfsize+1;
00070 CudaImage<float> dest(size,size, NO_INIT,mp,dev);
00071 Dims tile = CudaDevices::getDeviceTileSize(dev);
00072 cuda_c_dogFilter(dest.getCudaArrayPtr(),stddev,theta,halfsize,size,tile.w(),tile.h());
00073 return dest;
00074 }
00075
00076
00077
00078
00079 CudaImage<float> cudaGaborFilter3(MemoryPolicy mp, int dev, const float major_stddev, const float minor_stddev,
00080 const float period, const float phase,
00081 const float theta, int size)
00082 {
00083
00084 ASSERT(mp != HOST_MEMORY);
00085 const float max_stddev =
00086 major_stddev > minor_stddev ? major_stddev : minor_stddev;
00087
00088
00089 if (size == -1) size = int(ceil(max_stddev * sqrt(-2.0F * log(exp(-5.0F)))));
00090 else size = size/2;
00091
00092 CudaImage<float> result = CudaImage<float>(2 * size + 1, 2 * size + 1,NO_INIT,mp,dev);
00093 CudaImage<float> avg;
00094 Dims tile = CudaDevices::getDeviceTileSize1D(dev);
00095 cuda_c_gaborFilter3(result.getCudaArrayPtr(),major_stddev,minor_stddev,period,phase,theta,size,tile.sz(),result.size());
00096 cudaGetAvg(result,avg);
00097 result -= avg;
00098 return result;
00099 }
00100
00101
00102 CudaImage<float> cudaGaussian(MemoryPolicy mp, int dev, const float coeff, const float sigma,
00103 const int maxhw, const float threshperc)
00104 {
00105
00106 ASSERT(mp != HOST_MEMORY);
00107
00108
00109 int hw = (int)(sigma * sqrt(-2.0F * log(threshperc / 100.0F)));
00110
00111
00112 if (maxhw > 0 && hw > maxhw) hw = maxhw;
00113
00114
00115 CudaImage<float> result = CudaImage<float>(2 * hw + 1, 1,NO_INIT,mp,dev);
00116 Dims tile = CudaDevices::getDeviceTileSize1D(dev);
00117
00118 float c = coeff;
00119 if (coeff == 0.0F) c = 1.0F / (sigma * sqrtf(2.0f * float(M_PI)));
00120 const float sig22 = - 0.5F / (sigma * sigma);
00121 cuda_c_gaussian(result.getCudaArrayPtr(),c,sig22,hw,tile.sz(),result.size());
00122 return result;
00123 }
00124
00125