void ReAllocKernel(int w, int h, float sigma=0.4) { double ScaleToObj = sigma*1.39; int kernel_width = cvRound(w/ScaleToObj); int kernel_height = cvRound(h/ScaleToObj); int x,y,s; assert(w>0); assert(h>0); m_ObjSize = cvSize(w,h); m_KernelMeanShiftSize = cvSize(kernel_width,kernel_height); /* Create kernels for histogram calculation: */ if(m_KernelHistModel) cvReleaseMat(&m_KernelHistModel); m_KernelHistModel = cvCreateMat(h, w, DefHistTypeMat); calcKernelEpanechnikov(m_KernelHistModel); if(m_KernelHistCandidate) cvReleaseMat(&m_KernelHistCandidate); m_KernelHistCandidate = cvCreateMat(kernel_height, kernel_width, DefHistTypeMat); calcKernelEpanechnikov(m_KernelHistCandidate); if(m_Weights) cvReleaseMat(&m_Weights); m_Weights = cvCreateMat(kernel_height, kernel_width, CV_32F); for(s=-SCALE_RANGE; s<=SCALE_RANGE; ++s) { /* Allocate kernel for meanshifts in space and scale: */ int si = s+SCALE_RANGE; double cur_sigma = sigma * pow(SCALE_BASE,s); double cur_sigma2 = cur_sigma*cur_sigma; double x0 = 0.5*(kernel_width-1); double y0 = 0.5*(kernel_height-1); if(m_KernelMeanShiftK[si]) cvReleaseMat(&m_KernelMeanShiftK[si]); if(m_KernelMeanShiftG[si]) cvReleaseMat(&m_KernelMeanShiftG[si]); m_KernelMeanShiftK[si] = cvCreateMat(kernel_height, kernel_width, DefHistTypeMat); m_KernelMeanShiftG[si] = cvCreateMat(kernel_height, kernel_width, DefHistTypeMat); for(y=0; y<kernel_height; ++y) { DefHistType* pK = (DefHistType*)CV_MAT_ELEM_PTR_FAST( m_KernelMeanShiftK[si][0], y, 0, sizeof(DefHistType) ); DefHistType* pG = (DefHistType*)CV_MAT_ELEM_PTR_FAST( m_KernelMeanShiftG[si][0], y, 0, sizeof(DefHistType) ); for(x=0; x<kernel_width; ++x) { double r2 = ((x-x0)*(x-x0)/(x0*x0)+(y-y0)*(y-y0)/(y0*y0)); double sigma12 = cur_sigma2 / 2.56; double sigma22 = cur_sigma2 * 2.56; pK[x] = (DefHistType)(Gaussian2D(r2, sigma12)/sigma12 - Gaussian2D(r2, sigma22)/sigma22); pG[x] = (DefHistType)(Gaussian2D(r2, cur_sigma2/1.6) - Gaussian2D(r2, cur_sigma2*1.6)); } } /* Next line. */ } } /* ReallocKernel */
void Smooth(double **im, double **ims,int width,int height, int size, double theta){ double **kernel; int i; cout<<"g 01"<<flush<<endl; kernel=new double*[size]; for (i=0;i<size;i++) kernel[i]=new double[size]; cout<<"g 01"<<flush<<endl; Gaussian2D(kernel,theta,size); cout<<"g 01"<<flush<<endl; Convolution2DPadded(im,ims,width,height,kernel,size,size); cout<<"g 01"<<flush<<endl; for(i=0;i<size;i++) delete(kernel[i]); delete(kernel); }