www.pudn.com > GPUVision_5-13-05-2.zip > GausPyramid.cpp
#include "GausPyramid.h"
static float gkernel3_3[9] = {.0625, .125, .0625, .125, .25, .125, .0625, .125, .0625};
static float _gauss5xKernel[5] = {.1.25,.2,.3.5,.2,.1.25};
GausPyramid::GausPyramid(CGcontext context,GPUVision *level0, int numLevels, float divisor){
_divisor = divisor;
if(divisor == 3) {
_gauss5x5h = new ConvolutionFilter(_gauss5xKernel,5,1,3,context);
_gauss5x5v = new ConvolutionFilter(_gauss5xKernel,1,5,3,context);
} else {
_gauss3x3Kernel = new ConvolutionFilter(gkernel3_3,3,3,3);
}
// _laplacian = new Laplacian(context);
if(numLevels == 0) numLevels = 1;
int i;
int totLevels = 1;
int width = level0->GetWidth();
int height = level0->GetHeight();
for(i = 1; i < numLevels; i++) {
width = width/divisor;
height = height/divisor;
if(width == 0 || height == 0) {
break;
}
totLevels++;
}
_numLevels = totLevels;
_levels = (GPUVision**)new int[_numLevels];
_levels[0] = level0->Copy();
unsigned int *textureIDs = new unsigned int[_numLevels-1];
glGenTextures(_numLevels-1,textureIDs);
width = level0->GetWidth();
height = level0->GetHeight();
bool destroy = false;
for(i = 1; i < _numLevels; i++) {
width = width/_divisor;
height = height/_divisor;
if(!destroy && (width == 0 || height == 0)) {
_numLevels = i-1;
destroy = true;
}
if(destroy) {
glDeleteTextures(1,&textureIDs[i-1]);
} else {
GPUVision *prevLevel = _levels[i-1];
GPUVision *nextLevel = new GPUVision(textureIDs[i-1],width,height);
_levels[i] = nextLevel;
if(divisor == 3) {
prevLevel->Begin();
_gauss5x5h->applyFilter(prevLevel);
nextLevel->Begin(prevLevel);
_gauss5x5v->applyFilter(prevLevel,nextLevel);
} else {
nextLevel->Begin();
_gauss3x3Kernel->applyFilter(prevLevel,nextLevel);
}
// nextLevel->Flip();
nextLevel->CopyRenderedToSource();
nextLevel->End();
nextLevel->Reset();
prevLevel->Reset();
}
}
}
GausPyramid::~GausPyramid(){
for(int i = 0; i < _numLevels; i++) {
delete _levels[i];
}
delete _levels;
delete _gauss3x3Kernel;
// delete _gauss5x5h;
// delete _gauss5x5v;
}
void GausPyramid::Level0Updated() {
GPUVision *level0 = _levels[0];
int width = level0->GetWidth();
int height = level0->GetHeight();
for(int i = 1; i < _numLevels; i++) {
GPUVision *prevLevel = _levels[i-1];
GPUVision *nextLevel = _levels[i];
width = nextLevel->GetWidth();
height = nextLevel->GetHeight();
nextLevel->Reset();
prevLevel->Reset();
if(_divisor == 3) {
prevLevel->Begin();
_gauss5x5h->applyFilter(prevLevel);
nextLevel->Begin(prevLevel);
_gauss5x5v->applyFilter(prevLevel,nextLevel);
} else {
nextLevel->Begin();
_gauss3x3Kernel->applyFilter(prevLevel,nextLevel);
}
// nextLevel->Flip();
nextLevel->CopyRenderedToSource();
nextLevel->End();
// nextLevel->Reset();
// _laplacian->laplacian(nextLevel);
nextLevel->Reset();
prevLevel->Reset();
}
}