www.pudn.com > GPUVision_5-13-05-2.zip > FirstTest.cpp


#include "stdafx.h" 
#include "gpuvision.h" 
#include "MultiplyFilter.h" 
#include "ConvolutionFilter.h" 
#include "ConvolutionFilter2Pack.h" 
#include "Unpack2ChannelsFilter.h" 
#include "GaborFilter.h" 
#include "RGB2GreyFilter.h" 
#include "RGB2PackedUVFilter.h" 
#include "Pack2Filter.h" 
#include "AddFilter.h" 
#include "ThresholdFilter.h" 
#include "HarrisFilter.h" 
#include "NonMaxSupressionFilter.h" 
#include "LocalMaximumFilter.h" 
#include "Canny.h" 
#include "Sharpen.h" 
#include "LapGaus.h" 
#include "Laplacian.h" 
#include "DxDyFilter.h" 
#include "GausPyramid.h" 
#include "HarrisCorner.h" 
#include  
#include  
 
using namespace std; 
using namespace corona; 
 
#define GABOR_WIDTH 100 
///////////////////////////////////////////////////////////////////////// 
// Test Driver 
///////////////////////////////////////////////////////////////////////// 
 
GausPyramid *gausPyramid; 
LocalMaximumFilter *localMaximumFilter; 
 
GPUVision *gpuVis,  
*gpuVis2, 
*gpuVis3, 
*gpuVis4, 
*gpuVis5, 
*gpuVis6, 
*gpuVis7, 
*gpuVis8, 
*rightGPUvis, 
*leftGPUvis, 
*gaborGPUvis; 
Canny *canny; 
Sharpen *sharpen; 
Laplacian *laplacian; 
LapGaus *lapGaus; 
DxDyFilter *dxdy; 
static float harrisThreshold = .01; 
static int gaborNum = 0; 
static int gausPyrIndex = 0; 
static int gaborFilterWidthEven = 6; 
static long startTime; 
static int lapMode = 0; 
static float cannyThreshold = .1; 
static int sharpFilterNum = 2; 
static float sharpSharpness = 4; 
static bool doHarris = true, doCannyEdge = true, cannyShouldBlur = true, doLapGaus = true, cannShouldPack = true; 
static float hkernel2_1[4] = {1, 1, -1,-1}; 
static float vkernel2_1[4] = {1, -1, 1,-1}; 
static float hkernel2_2[4] = {-1, -1, 1,1}; 
static float vkernel2_2[4] = {-1, 1, -1,1}; 
 
static float gkernel3_1[9] = {.2, .1, .1, .1, .0, .1, .1, .1, .2}; 
static float gkernel3_2[9] = {.1, .1, .1, .1, .2, .1, .1, .1, .1}; 
static float gkernel3_3[9] = {.0625, .125, .0625, .125, .25, .125, .0625, .125, .0625}; 
static float lkernel3_3[9] = {.1, .4, .1, .4, -1, .4, .1, .4, .1}; 
 
static float gkernel5_1[25] = {.04, .04, .04, .04, .04,  
							  .04, .04, .04, .04, .04,  
							  .04, .04, .04, .04, .04,  
							  .04, .04, .04, .04, .04,  
							  .04, .04, .04, .04, .04}; 
 
static float lkernel5_1[25] = {.00, .03, .2, .03, .00,  
							  .03, .3,  -.1, .3, .03,  
							  .2, -.1, -.9, -.1, .2,  
							  .03, .3,  -.1, .3, .03,  
							  .00, .03, .2, .03, .00}; 
 
static float gkernel10_1[100] = {.01, .01, .01, .01, .01,.01, .01, .01, .01, .01,  
							  .01, .01, .01, .01, .01, .01, .01, .01, .01, .01, 
							  .01, .01, .01, .01, .01, .01, .01, .01, .01, .01, 
							  .01, .01, .01, .01, .01, .01, .01, .01, .01, .01, 
							  .01, .01, .01, .01, .01, .01, .01, .01, .01, .01, 
							  .01, .01, .01, .01, .01, .01, .01, .01, .01, .01, 
							  .01, .01, .01, .01, .01, .01, .01, .01, .01, .01, 
							  .01, .01, .01, .01, .01, .01, .01, .01, .01, .01, 
							  .01, .01, .01, .01, .01, .01, .01, .01, .01, .01, 
							  .01, .01, .01, .01, .01, .01, .01, .01, .01, .01}; 
 
static float _gauss5x5Kernel[25] = { 
   .005600,   .013150,   .037500,   .013150,   .005600, 
   .013150,   .030600,   .087500,   .030600,   .013150, 
   .037500,   .087500,   .250100,   .087500,   .037500, 
   .013150,   .030600,   .087500,   .030600,   .013100, 
   .005600,   .013150,   .037500,   .013150,   .005600}; 
 
static float h_gkernel9_1[9] = {.015, .035, .05, .15, .5, .15, .05, .035, .015}; 
static float h_gkernel5_1[5] = {.1,.15,.5,.15,.1}; 
static float h_gkernel3_1[5] = {.2,.6,.2}; 
 
static float *gaborData = new float[gaborFilterWidthEven*gaborFilterWidthEven]; 
static float gaborData0[81]; 
static float gaborData30[81]; 
static float gaborData60[81]; 
static float gaborData90[81]; 
static float gaborData120[81]; 
static float gaborData150[81]; 
static float gaborData180[81]; 
static float gaborData210[81]; 
static float gaborData240[81]; 
static float gaborData270[81]; 
static float gaborData300[81]; 
static float gaborData330[81]; 
 
static HarrisFilter* harrisFilter; 
static HarrisCorner* harrisCorner; 
static MultiplyFilter* multFilter; 
static ConvolutionFilter  
*gaus3x3Filter,  
*convolutionFilter, 
*convolutionFilter2, 
*h_convolutionFilter, 
*v_convolutionFilter, 
*h5_convolutionFilter, 
*v5_convolutionFilter, 
*h100_convolutionFilter, 
*v100_convolutionFilter, 
*h3_convolutionFilter, 
*v3_convolutionFilter; 
 
static ConvolutionFilter *lap5x5Filter; 
static ConvolutionFilter2Pack *gaus3x3FilterPacked; 
 
static ConvolutionFilter  
*gaborFilter1, 
*gaborFilter0, 
*gaborFilter30, 
*gaborFilter60, 
*gaborFilter90, 
*gaborFilter120, 
*gaborFilter150, 
*gaborFilter180, 
*gaborFilter210, 
*gaborFilter240, 
*gaborFilter270, 
*gaborFilter300, 
*gaborFilter330; 
static RGB2GreyFilter *rgb2greyFilter1; 
static RGB2PackedUVFilter *rgb2packedUVFilter; 
static Pack2Filter *pack2Filter; 
static AddFilter *addFilter1; 
static ThresholdFilter *thresholdFilter ; 
static NonMaxSupressionFilter *nonMaxSupression ; 
static Unpack2ChannelsFilter *unpack2ChannelsFilter; 
 
static int selection = 0; 
static GPUVision *curGPUvis; 
static float multNum = -.25; 
static float threshold = .3; 
static bool showGabor = false; 
static bool showCos = false; 
static float sigma = 3.7; 
static float cosGabor[1000000]; 
static float sinGabor[1000000]; 
#define RADIUS 36 
 
 
static void DoExit() { 
      delete gausPyramid; 
      delete localMaximumFilter; 
 
      delete gpuVis;  
      delete gpuVis2; 
      delete gpuVis3; 
      delete gpuVis4; 
      delete gpuVis5; 
      delete gpuVis6; 
      delete gpuVis7; 
      delete gpuVis8; 
      delete rightGPUvis; 
      delete leftGPUvis; 
      delete gaborGPUvis; 
      delete canny; 
      delete sharpen; 
      delete laplacian; 
      delete lapGaus; 
      delete dxdy; 
 
	  delete gaborData; 
      delete harrisFilter; 
      delete harrisCorner; 
      delete multFilter; 
      delete gaus3x3Filter;  
      delete convolutionFilter; 
      delete convolutionFilter2; 
      delete h_convolutionFilter; 
      delete v_convolutionFilter; 
      delete h5_convolutionFilter; 
      delete v5_convolutionFilter; 
      delete h100_convolutionFilter; 
      delete v100_convolutionFilter; 
      delete h3_convolutionFilter; 
      delete v3_convolutionFilter; 
      delete lap5x5Filter; 
      delete gaus3x3FilterPacked; 
 
      delete gaborFilter1; 
      delete gaborFilter0; 
      delete gaborFilter30; 
      delete gaborFilter60; 
      delete gaborFilter90; 
      delete gaborFilter120; 
      delete gaborFilter150; 
      delete gaborFilter180; 
      delete gaborFilter210; 
      delete gaborFilter240; 
      delete gaborFilter270; 
      delete gaborFilter300; 
      delete gaborFilter330; 
      delete rgb2greyFilter1; 
      delete rgb2packedUVFilter; 
      delete pack2Filter; 
      delete addFilter1; 
      delete thresholdFilter ; 
      delete nonMaxSupression ; 
      delete unpack2ChannelsFilter; 
} 
 
 
char *float2string (const float n, const char* efg, const unsigned int after_digits) { 
// Usage: 
//   double_to_string(number, format, x) if you want x decimals after the dot. 
//                                       format means one of the format flags printf knows: e, f, g 
    double       absN = fabs(n); 
    int          before_digits = 1; 
    char         sign[2]; 
    static char  format[128]; 
    static char  text[128]; 
	// Do we use printf format '%f'? 
    if (strncmp(efg, "f", 1) == 0) { 
	// Determine the number of digits before comma 
	(absN > 0) ?  
	    before_digits = int(float(log10(absN))) + 1 : 
	    before_digits = 1; 
    } 
    // Display a zero if n is negative, but don't show a plus if positive. 
    // Therefore we can't use "%+s" in sprintf. 
    if (n < 0) 
	strncpy (sign, "-", 2); 
    else 
	strncpy (sign, " ", 2); 
    sprintf (format, "%s%%%d.%d%s", sign, before_digits, after_digits, efg); 
    // Size of text in Bytes: 
    // 1            : sign,  
    // before_digits: # digits before comma 
    // 1            : comma 
    // after_digits : # digits after comma 
    // 5            : eħ300 
    sprintf (text, format, absN); 
    return text; 
} 
 
void printTiming (const double start, const double end, const char* label) { 
	double total = (end-start) / CLOCKS_PER_SEC; 
	std::string s = label; 
	s.append(": "); 
	s.append(float2string(total,"f",5)); 
	s.append(" seconds."); 
	cout << s << endl; 
} 
 
static void Display()  
{ 
	canny->setShouldBlur(cannyShouldBlur); 
	canny->setPack(cannShouldPack); 
//	gpuVis->Reset(); 
//	gpuVis2->Reset(); 
//	gpuVis3->Reset(); 
	curGPUvis = gpuVis; 
	static int curTime = 0; 
	int i = 0; 
	int viewportY = 0; 
	//selection = (curTime%9000)/1000; 
	static float theta = 0; 
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
	if(showGabor) { 
		theta = (curTime%(360*1))/1; 
		GaborFilter::Gabor4(sigma,theta,GABOR_WIDTH,showCos,sinGabor); 
		if(showCos) { 
			gaborGPUvis->SetData(sinGabor); 
		} else { 
			gaborGPUvis->SetData(sinGabor); 
		} 
		addFilter1->SetAddNum(.5); 
		gaborGPUvis->Begin(); 
		addFilter1->applyFilter(gaborGPUvis); 
		gaborGPUvis->End(); 
 
		gaborGPUvis->PassThrough(gaborGPUvis->GetRenderedTextureID()); 
		gaborGPUvis->Reset(); 
	} else { 
		switch(selection) { 
		case 0: 
			gpuVis->Reset(); 
			if(gaborNum == 1) { 
				gaus3x3Filter->applyFilter(gpuVis); 
			} if(gaborNum == 2) { 
				lap5x5Filter->applyFilter(gpuVis); 
			} if(gaborNum == 3) { 
				convolutionFilter2->applyFilter(gpuVis); 
			} 
//			gpuVis->PassThrough(gpuVis->GetTextureID()); 
			break; 
		case 1: 
			gpuVis->Reset(); 
			gpuVis->Begin(); 
			if(doCannyEdge) { 
				rgb2packedUVFilter->applyFilter(gpuVis); 
//				pack2Filter ->applyFilter(gpuVis); 
				if(doLapGaus) { 
					gaus3x3FilterPacked->applyFilter(gpuVis); 
					gaus3x3FilterPacked->applyFilter(gpuVis); 
					gaus3x3FilterPacked->applyFilter(gpuVis); 
					gaus3x3FilterPacked->applyFilter(gpuVis); 
				} 
				unpack2ChannelsFilter->applyFilter(gpuVis); 
			} else { 
				lap5x5Filter->applyFilter(gpuVis); 
				lap5x5Filter->applyFilter(gpuVis); 
				lap5x5Filter->applyFilter(gpuVis); 
				lap5x5Filter->applyFilter(gpuVis); 
			} 
			gpuVis->End(); 
//			multFilter->SetMultNum(abs(500-curTime%1000)/100.); 
//			gpuVis->Reset(); 
//			gpuVis->Begin(); 
//			multFilter->applyFilter(gpuVis); 
/*			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis); 
			multFilter->applyFilter(gpuVis);*/ 
//			gpuVis->End(); 
 
//			gpuVis->Begin(); 
//			gpuVis->Convolude1D(2,vkernel2_1); 
//			gpuVis->End(); 
////			gpuVis->Flip(); 
			break; 
		case 2: 
			gpuVis->Reset(); 
			gpuVis3->Reset(); 
			if(doLapGaus) 
				lapGaus->lapGausEdgeDetect(gpuVis); 
			else 
				laplacian->laplacian(gpuVis3,gpuVis); 
 
			if(doCannyEdge) { 
				canny->setThreshold(cannyThreshold); 
				canny->cannyEdgeDetect(gpuVis); 
			} 
//			gpuVis->Begin(); 
//			convolutionFilter->applyFilter(gpuVis); 
//			gpuVis->End(); 
			break; 
		case 3: 
			gpuVis2->Reset(); 
			gpuVis2->Begin(); 
			multFilter->SetMultNum(.1); 
			multFilter->applyFilter(gpuVis2); 
			gpuVis2->End(); 
 
			gpuVis->Reset(); 
			gpuVis->Begin(); 
			rgb2greyFilter1->applyFilter(gpuVis); 
			addFilter1->applyFilter(gpuVis); 
			addFilter1->applyFilter(gpuVis,gpuVis2); 
			gpuVis->End(); 
			break; 
		case 4: 
			for(i = gausPyrIndex; i < gausPyramid->GetNumLevels(); i++) { 
				curGPUvis = gausPyramid->GetLevel(i); 
				curGPUvis->Reset(); 
				curGPUvis->DisplayCurrent(); 
				viewportY += gausPyramid->GetLevel(i)->GetHeight(); 
			    glViewport(0, viewportY, gpuVis->GetWidth(), gpuVis->GetHeight()); 
			} 
		    glViewport(gausPyramid->GetLevel(gausPyrIndex)->GetWidth(), 0, gpuVis->GetWidth(), gpuVis->GetHeight()); 
			viewportY = 0; 
			for(i = gausPyrIndex; i < gausPyramid->GetNumLevels(); i++) { 
				curGPUvis = gausPyramid->GetLevel(i); 
				curGPUvis->Reset(); 
				laplacian->laplacian(curGPUvis); 
//				rgb2greyFilter1->applyFilter(curGPUvis); 
				curGPUvis->DisplayCurrent(); 
				viewportY += gausPyramid->GetLevel(i)->GetHeight(); 
			    glViewport(gausPyramid->GetLevel(gausPyrIndex)->GetWidth(), viewportY, gpuVis->GetWidth(), gpuVis->GetHeight()); 
			} 
		    glViewport(0, 0, gpuVis->GetWidth(), gpuVis->GetHeight()); 
//			gpuVis->Reset(); 
//			gaus3x3Filter->applyFilter(gpuVis); 
 
/*			gpuVis3->Reset(); 
			gpuVis4->Reset(); 
			gpuVis5->Reset(); 
			gpuVis6->Reset(); 
			gpuVis7->Reset(); 
			gpuVis8->Reset(); 
			rgb2greyFilter1->applyFilter(gpuVis); 
			rgb2greyFilter1->applyFilter(gpuVis3); 
			rgb2greyFilter1->applyFilter(gpuVis4); 
			rgb2greyFilter1->applyFilter(gpuVis5); 
			rgb2greyFilter1->applyFilter(gpuVis6); 
			rgb2greyFilter1->applyFilter(gpuVis7); 
			rgb2greyFilter1->applyFilter(gpuVis8); 
 
			gaborFilter0->applyFilter(gpuVis); 
			gaborFilter30->applyFilter(gpuVis3); 
			gaborFilter60->applyFilter(gpuVis4); 
			gaborFilter90->applyFilter(gpuVis5); 
			gaborFilter120->applyFilter(gpuVis6); 
			gaborFilter150->applyFilter(gpuVis7); 
			gpuVis->Begin(); 
//			if(curTime%30<15) { 
//				cout <<"adding"<applyFilter(gpuVis,gpuVis3); 
				addFilter1->applyFilter(gpuVis,gpuVis4); 
				addFilter1->applyFilter(gpuVis,gpuVis5); 
				addFilter1->applyFilter(gpuVis,gpuVis6); 
				addFilter1->applyFilter(gpuVis,gpuVis7); 
//			} 
			gpuVis->End(); 
*/			break; 
		case 5: 
//		startTime = clock(); 
			curGPUvis = gausPyramid->GetLevel(gausPyrIndex); 
			curGPUvis->Reset(); 
//			gpuVis->Reset(); 
//			gpuVis->Begin(); 
//			v_convolutionFilter->applyFilter(gpuVis); 
//			gpuVis->End(); 
 
			if(doHarris) { 
//				laplacian->laplacian(curGPUvis); 
				harrisCorner->SetThreshold(harrisThreshold); 
				harrisCorner->SetShouldThin(doCannyEdge); 
				harrisCorner->HarrisCornerDetect(curGPUvis); 
 
//				dxdy->applyFilter(curGPUvis); 
//				harrisFilter->SetThreshold(harrisThreshold); 
//				harrisFilter->applyFilter(curGPUvis); 
//				if(doCannyEdge) { 
//					localMaximumFilter->applyFilter(curGPUvis); 
//				} 
			} else { 
				canny->setThreshold(cannyThreshold); 
				canny->cannyEdgeDetect(curGPUvis); 
			} 
//		printTiming(startTime,clock(),"Canny"); 
			break; 
		case 6: 
			gpuVis->Reset(); 
			gpuVis3->Reset(); 
			sharpen->setFilterNum(sharpFilterNum); 
			sharpen->setSharpness(sharpSharpness); 
			sharpen->sharpenImage(gpuVis3,gpuVis); 
//			gpuVis->CopyRenderedToSource(); 
//			gpuVis->Reset(); 
			if(doCannyEdge) { 
				canny->setThreshold(cannyThreshold); 
				canny->cannyEdgeDetect(gpuVis); 
			} 
//			gpuVis4->Reset(); 
//			sharpen->sharpenImage(gpuVis4,gpuVis); 
 
//			gpuVis->Reset(); 
//			gpuVis->Begin(); 
//			h_convolutionFilter->applyFilter(gpuVis); 
//			v_convolutionFilter->applyFilter(gpuVis); 
//			gpuVis->End(); 
			break; 
		case 7: 
			gpuVis->Reset(); 
			gpuVis->Begin(); 
			dxdy->applyFilter(gpuVis); 
//			h5_convolutionFilter->applyFilter(gpuVis); 
//			v5_convolutionFilter->applyFilter(gpuVis); 
			gpuVis->End(); 
			break; 
		case 8: 
			if(gaborNum == 0) { 
				gpuVis3->Reset(); 
				gpuVis3->Begin(); 
	//			multFilter->SetMultNum(2); 
	//			multFilter->applyFilter(gpuVis3); 
	//			thresholdFilter->applyFilter(gpuVis3); 
				multFilter->SetMultNum(-1); 
				multFilter->applyFilter(gpuVis3); 
				gpuVis3->End(); 
 
				gpuVis->Reset(); 
				gpuVis->Begin(); 
				h3_convolutionFilter->applyFilter(gpuVis); 
				v3_convolutionFilter->applyFilter(gpuVis); 
	//			h100_convolutionFilter->applyFilter(gpuVis); 
	//			v100_convolutionFilter->applyFilter(gpuVis); 
				addFilter1->applyFilter(gpuVis,gpuVis3); 
				rgb2greyFilter1->applyFilter(gpuVis); 
	//			gaborFilter90->applyFilter(gpuVis); 
				multFilter->SetMultNum(10); 
				multFilter->applyFilter(gpuVis); 
	//			canny->cannyEdgeDetect(gpuVis); 
	//			nonMaxSupression->applyFilter(gpuVis); 
				gpuVis->End(); 
			} else { 
				gpuVis->Reset(); 
				gpuVis->Begin(); 
				rgb2greyFilter1->applyFilter(gpuVis); 
				if(gaborNum == 1) { 
					gaborFilter0->applyFilter(gpuVis); 
				} else if(gaborNum == 2) { 
					gaborFilter30->applyFilter(gpuVis); 
				} else if(gaborNum == 3) { 
					gaborFilter60->applyFilter(gpuVis); 
				} else if(gaborNum == 4) { 
					gaborFilter90->applyFilter(gpuVis); 
				} else if(gaborNum == 5) { 
					gaborFilter120->applyFilter(gpuVis); 
				} else if(gaborNum == 6) { 
					gaborFilter150->applyFilter(gpuVis); 
				} else if(gaborNum == 7) { 
					gaborFilter180->applyFilter(gpuVis); 
				} else if(gaborNum == 8) { 
					gaborFilter210->applyFilter(gpuVis); 
				} else if(gaborNum == 9) { 
					gaborFilter240->applyFilter(gpuVis); 
				} else if(gaborNum == 10) { 
					gaborFilter270->applyFilter(gpuVis); 
				} else if(gaborNum == 11) { 
					gaborFilter300->applyFilter(gpuVis); 
				} else if(gaborNum == 12) { 
					gaborFilter330->applyFilter(gpuVis); 
				} 
				addFilter1->SetAddNum(.5); 
				addFilter1->applyFilter(gpuVis); 
				gpuVis->End(); 
			} 
			break; 
		case 9: 
			GaborFilter::Gabor(sigma,curTime%360,gaborFilterWidthEven,showCos,gaborData); 
			gpuVis->Reset(); 
			gpuVis->Begin(); 
			rgb2greyFilter1->applyFilter(gpuVis); 
			gaborFilter1->applyFilter(gpuVis); 
			addFilter1->SetAddNum(.5); 
			addFilter1->applyFilter(gpuVis); 
			gpuVis->End(); 
			break; 
		} 
 
		if(selection != 4)  
			curGPUvis->DisplayCurrent(); 
	} 
//	Sleep(10); 
	glutSwapBuffers(); 
    glutPostRedisplay(); 
	curTime ++; 
} 
 
static void Reshape(int w, int h) 
{ 
    if (h == 0) h = 1; 
     
	if(gpuVis) { 
		w = gpuVis->GetWidth(); 
		h = gpuVis->GetHeight(); 
	} 
 
    glViewport(0, 0, w, h); 
     
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
     
	glOrtho(0,w,0,h,0,-1); 
 
} 
 
 
static void Keyboard(unsigned char key, int x, int y) 
{ 
    switch(key) { 
	case 'q': 
	case 'Q':  
	case 27: 
		DoExit(); 
        exit(0); 
		break; 
	case 48: 
	case 49: 
	case 50: 
	case 51: 
	case 52: 
	case 53: 
	case 54: 
	case 55: 
	case 56: 
	case 57: 
		selection = key-48; 
		break; 
	case '+': 
		cannyThreshold+=.0001; 
		break; 
	case '-': 
		cannyThreshold-=.0001; 
		break; 
	case ']': 
		sharpSharpness +=.01; 
		break; 
	case '[': 
		sharpSharpness -=.01; 
		break; 
	case 'g': 
		gaborNum++; 
		gaborNum %= selection==0?4:13; // 0 is don't show 
		break; 
	case 'G': 
		showGabor = !showGabor; 
		break; 
	case 's': 
		sigma += .1; 
		cout << "sigma " << sigma << endl; 
		break; 
	case 'S': 
		sigma -= .1; 
		sigma = max(1,sigma); 
		cout << "sigma " << sigma << endl; 
		break; 
	case 'h': 
		harrisThreshold += .001; 
		cout << "harrisThreshold " << harrisThreshold << endl; 
		break; 
	case 'H': 
		harrisThreshold -= .001; 
		cout << "harrisThreshold " << harrisThreshold << endl; 
		break; 
	case 'j': 
		doHarris = !doHarris; 
		break; 
	case 'f': 
		sharpFilterNum += 1; 
		break; 
	case 'F': 
		sharpFilterNum -= 1; 
		sharpFilterNum = max(1,sharpFilterNum); 
		break; 
	case 'c': 
		showCos = !showCos; 
		break; 
	case 'C': 
		doCannyEdge = !doCannyEdge; 
		break; 
	case 'b': 
		cannyShouldBlur = !cannyShouldBlur; 
		break; 
	case 'l': 
		doLapGaus = !doLapGaus; 
		break; 
	case 'u': 
		startTime = clock(); 
		gpuVis->SetData(gpuVis->GetDataFloats()); 
		printTiming(startTime,clock(),"Uploading Main Image"); 
		break; 
	case 'U': 
		startTime = clock(); 
		gpuVis->DownloadTexture(); 
		printTiming(startTime,clock(),"Downloading Main Image"); 
		break; 
	case 'm': 
		lapMode = (lapMode+1)%4; 
		lapGaus= new LapGaus(gaborFilter1->getContext(),lapMode); 
		break; 
	case 'p': 
		gausPyrIndex = (gausPyrIndex+1)%gausPyramid->GetNumLevels(); 
		break; 
	case 'P': 
		cannShouldPack = !cannShouldPack; 
	} 
} 
 
static void NavMouseInput(int button, int state, int x, int y) 
{ 
    if (button==GLUT_LEFT_BUTTON) 
    { 
        if (state==GLUT_UP)  
        { 
            float SiteIDf[4]; 
             
            int yy = (int)glutGet((GLenum)GLUT_WINDOW_HEIGHT)-1-y; 
			gpuVis->Begin(); 
            glReadPixels(x,(int)glutGet((GLenum)GLUT_WINDOW_HEIGHT)-1-y,1,1,GL_RGBA,GL_FLOAT,SiteIDf); 
            gpuVis->End(); 
 
            printf("(%d %d)\t%f\t%f\t%f\t%f\n", 
            x,(int)glutGet((GLenum)GLUT_WINDOW_HEIGHT)-1-y, SiteIDf[0], 
            SiteIDf[1],SiteIDf[2], SiteIDf[3]); fflush(stdout); 
        } 
    } 
} 
 
 
static void handleCgError()  
{ 
    fprintf(stderr, "Cg error: %s\n", cgGetErrorString(cgGetError())); 
    exit(1); 
} 
 
static void ProcessMenu(int value) { 
	selection = value; 
} 
 
int main(int argc, char* argv[]) 
{ 
	glutInit(&argc, argv); 
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
	glutInitWindowSize(512, 512); 
	glutCreateWindow("GPUVision - Upenn - Ahn, Lehr, Turner"); 
 
	glutReshapeFunc(Reshape); 
	glutKeyboardFunc(Keyboard); 
	glutDisplayFunc(Display); 
	glutMouseFunc(NavMouseInput); 
	int err = glewInit(); 
	if (GLEW_OK != err) 
	{ 
		// problem: glewInit failed, something is seriously wrong 
		fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err)); 
		exit(-1); 
	}   
 
	// Basic Cg setup; register a callback function for any errors 
	// and create an initial context 
	cgSetErrorCallback(handleCgError); 
 
 
	glutCreateMenu(ProcessMenu); 
	glutAddMenuEntry("Original",0); 
	glutAddMenuEntry("Horizontal Edges 1",1); 
	glutAddMenuEntry("Horizontal Edges 2",3); 
	glutAddMenuEntry("Vertical Edges 1",2); 
	glutAddMenuEntry("Vertical Edges 2",4); 
	glutAddMenuEntry("Test",5); 
	glutAddMenuEntry("Grey Scale",6); 
	glutAddMenuEntry("All Edges (1 pass)",7); 
	glutAddMenuEntry("5x5 Blur",8); 
	glutAddMenuEntry("Comples edge detect",9); 
	glutAttachMenu(GLUT_RIGHT_BUTTON); 
 
	try { 
		for(int i = 0; i < 100000; i++) { 
			cosGabor[i] = 0; 
		} 
//		const char *testGPUVis = "images\\test2-small.jpg"; 
//		const char *testGPUVis = "images\\handeater.jpg"; 
//		const char *testGPUVis = "images\\face.jpg"; 
//		const char *testGPUVis = "images\\bug.jpg"; 
//		const char *testGPUVis = "images\\rockon.jpg"; 
//		const char *testGPUVis = "images\\eurocup2.jpg"; 
//		const char *testGPUVis = "images\\eurocup.jpg"; 
//		const char *testGPUVis = "images\\halloween.jpg"; 
//		const char *testGPUVis = "images\\halloween2.jpg"; 
//		const char *testGPUVis = "images\\pose.jpg"; 
//		const char *testGPUVis = "images\\gypsy.jpg"; 
//		const char *testGPUVis = "images\\jianbo.jpg"; 
//		const char *testGPUVis = "images\\GirlOnRock.jpg"; 
		const char *testGPUVis = "images\\lena.jpg"; 
//		const char *testGPUVis = "images\\1-15port.slide1.jpg"; 
//		const char *testGPUVis = "images\\2-15port.slide5.jpg"; 
//		const char *testGPUVis = "images\\3-blackdot.jpg"; 
//		const char *testGPUVis = "images\\4-France_stone.jpg"; 
//		const char *testGPUVis = "images\\5-philly.jpg"; 
//		const char *testGPUVis = "images\\6-15shop.5.jpg"; 
//		const char *testGPUVis = "images\\colleseum.jpg"; 
//		const char *testGPUVis = "images\\test2D.jpg"; 
//		const char *testGPUVis = "images\\test.jpg"; 
//		const char *testGPUVis = "images\\test_blstripes.jpg"; 
//		const char *testGPUVis = "images\\Org_Left.jpg"; 
		const char *leftDispPic = "images\\Org_Left.jpg"; 
		const char *rightDispPic = "images\\Org_Right.jpg"; 
//		gpuVis = new GPUVision("images\\test_blstripes.jpg"); 
//		gpuVis = new GPUVision("images\\e.jpg"); 
//		gpuVis = new GPUVision("images\\test2-small.jpg"); 
//		gpuVis = new GPUVision("images\\test.jpg"); 
		gpuVis = new GPUVision(testGPUVis); 
		gpuVis2 = new GPUVision("images\\test2D.jpg"); 
		gpuVis2 = new GPUVision(testGPUVis); 
		gpuVis3 = new GPUVision(gpuVis2->GetTextureID(),gpuVis->GetWidth(), gpuVis->GetHeight()); 
		gpuVis4 = new GPUVision(gpuVis2->GetTextureID(),gpuVis->GetWidth(), gpuVis->GetHeight()); 
		gpuVis5 = new GPUVision(gpuVis2->GetTextureID(),gpuVis->GetWidth(), gpuVis->GetHeight()); 
		gpuVis6 = new GPUVision(gpuVis2->GetTextureID(),gpuVis->GetWidth(), gpuVis->GetHeight()); 
		gpuVis7 = new GPUVision(gpuVis2->GetTextureID(),gpuVis->GetWidth(), gpuVis->GetHeight()); 
		gpuVis8 = new GPUVision(gpuVis2->GetTextureID(),gpuVis->GetWidth(), gpuVis->GetHeight()); 
		rightGPUvis = new GPUVision(rightDispPic); 
		leftGPUvis = new GPUVision(leftDispPic); 
		gaborGPUvis = new GPUVision(new float[GABOR_WIDTH*GABOR_WIDTH*4],GABOR_WIDTH,GABOR_WIDTH); 
 
		multFilter = new MultiplyFilter(2, gpuVis->GetContext()); 
		int numChannels = 4; 
		convolutionFilter = new ConvolutionFilter(gkernel5_1,5,5,numChannels); 
		convolutionFilter2 = new ConvolutionFilter(gkernel10_1,10,10,numChannels); 
		h_convolutionFilter = new ConvolutionFilter(h_gkernel9_1,9,1,numChannels); 
		v_convolutionFilter = new ConvolutionFilter(h_gkernel9_1,1,9,numChannels); 
		h5_convolutionFilter = new ConvolutionFilter(h_gkernel5_1,5,1,numChannels); 
		v5_convolutionFilter = new ConvolutionFilter(h_gkernel5_1,1,5,numChannels); 
		h3_convolutionFilter = new ConvolutionFilter(h_gkernel3_1,3,1,numChannels); 
		v3_convolutionFilter = new ConvolutionFilter(h_gkernel3_1,1,3,numChannels); 
		h100_convolutionFilter = new ConvolutionFilter(gkernel10_1,100,1,numChannels); 
		v100_convolutionFilter = new ConvolutionFilter(gkernel10_1,1,100,numChannels); 
		GaborFilter::Gabor(sigma ,0,gaborFilterWidthEven,true,gaborData); 
		GaborFilter::Gabor(sigma ,0,gaborFilterWidthEven,true,gaborData0); 
		GaborFilter::Gabor(sigma ,30,gaborFilterWidthEven,true,gaborData30); 
		GaborFilter::Gabor(sigma ,60,gaborFilterWidthEven,true,gaborData60); 
		GaborFilter::Gabor(sigma ,90,gaborFilterWidthEven,true,gaborData90); 
		GaborFilter::Gabor(sigma ,120,gaborFilterWidthEven,true,gaborData120); 
		GaborFilter::Gabor(sigma ,150,gaborFilterWidthEven,true,gaborData150); 
		GaborFilter::Gabor(sigma ,180,gaborFilterWidthEven,true,gaborData180); 
		GaborFilter::Gabor(sigma ,210,gaborFilterWidthEven,true,gaborData210); 
		GaborFilter::Gabor(sigma ,240,gaborFilterWidthEven,true,gaborData240); 
		GaborFilter::Gabor(sigma ,270,gaborFilterWidthEven,true,gaborData270); 
		GaborFilter::Gabor(sigma ,300,gaborFilterWidthEven,true,gaborData300); 
		GaborFilter::Gabor(sigma ,330,gaborFilterWidthEven,true,gaborData330); 
 
		gaborFilter1 = new ConvolutionFilter(gaborData,gaborFilterWidthEven,gaborFilterWidthEven,numChannels); 
		gaborFilter0 = new ConvolutionFilter(gaborData0,gaborFilterWidthEven,gaborFilterWidthEven,numChannels); 
		gaborFilter30 = new ConvolutionFilter(gaborData30,gaborFilterWidthEven,gaborFilterWidthEven,numChannels); 
		gaborFilter60 = new ConvolutionFilter(gaborData60,gaborFilterWidthEven,gaborFilterWidthEven,numChannels); 
		gaborFilter90 = new ConvolutionFilter(gaborData90,gaborFilterWidthEven,gaborFilterWidthEven,numChannels); 
		gaborFilter120 = new ConvolutionFilter(gaborData120,gaborFilterWidthEven,gaborFilterWidthEven,numChannels); 
		gaborFilter150 = new ConvolutionFilter(gaborData150,gaborFilterWidthEven,gaborFilterWidthEven,numChannels); 
		gaborFilter180 = new ConvolutionFilter(gaborData180,gaborFilterWidthEven,gaborFilterWidthEven,numChannels); 
		gaborFilter210 = new ConvolutionFilter(gaborData210,gaborFilterWidthEven,gaborFilterWidthEven,numChannels); 
		gaborFilter240 = new ConvolutionFilter(gaborData240,gaborFilterWidthEven,gaborFilterWidthEven,numChannels); 
		gaborFilter270 = new ConvolutionFilter(gaborData270,gaborFilterWidthEven,gaborFilterWidthEven,numChannels); 
		gaborFilter300 = new ConvolutionFilter(gaborData300,gaborFilterWidthEven,gaborFilterWidthEven,numChannels); 
		gaborFilter330 = new ConvolutionFilter(gaborData330,gaborFilterWidthEven,gaborFilterWidthEven,numChannels); 
		rgb2greyFilter1 = new RGB2GreyFilter(); 
		rgb2packedUVFilter = new RGB2PackedUVFilter(); 
		pack2Filter = new Pack2Filter(); 
		unpack2ChannelsFilter = new Unpack2ChannelsFilter(); 
		thresholdFilter = new ThresholdFilter(1); 
		harrisFilter = new HarrisFilter(harrisThreshold,gaborFilter1->getContext()); 
		nonMaxSupression = new NonMaxSupressionFilter(cannyThreshold); 
		canny = new Canny(gaborFilter1->getContext(), cannyThreshold); 
		sharpen = new Sharpen(gaborFilter1->getContext(), sharpFilterNum, sharpSharpness); 
		laplacian = new Laplacian(gaborFilter1->getContext()); 
		lapGaus= new LapGaus(gaborFilter1->getContext(),lapMode); 
		addFilter1 = new AddFilter(.1); 
		dxdy = new DxDyFilter(); 
		gaus3x3Filter = new ConvolutionFilter(gkernel3_3,3,3,numChannels); 
		gaus3x3FilterPacked = new ConvolutionFilter2Pack(_gauss5x5Kernel,5,5,4); 
		lap5x5Filter = new ConvolutionFilter(_gauss5x5Kernel,5,5,4); 
		localMaximumFilter = new LocalMaximumFilter(gaborFilter1->getContext()); 
 
		harrisCorner = new HarrisCorner(gaborFilter1->getContext(),harrisThreshold); 
 
//		gausPyramid2 = new GausPyramid(gaborFilter1->getContext(),gpuVis,50,2); 
		startTime = clock(); 
		gausPyramid = new GausPyramid(gaborFilter1->getContext(),gpuVis,9,2); 
		printTiming(startTime,clock(),"Gaussian Pyramid"); 
		cout << "GausPyramid has " << gausPyramid->GetNumLevels()<<" levels"<GetDataFloats(), gpuVis->GetWidth(), gpuVis->GetHeight(),true); 
		printTiming(startTime,clock(),"Loading Mipmap"); 
		delete tmpVis; 
 
/*		startTime = clock(); 
		for(int j = 0; j < 100; j++) { 
			gausPyramid->GetLevel(0)->SetData(gpuVis->GetDataFloats()); 
			gausPyramid->Level0Updated(); 
			for(i = 0; i < gausPyramid->GetNumLevels(); i++) { 
				gausPyramid->GetLevel(i)->DownloadTexture(); 
			} 
		} 
		printTiming(startTime,clock(),"100 Upload Img, Regen GausPyramid and Download Img"); 
*/		for(i = 0; i < gaborFilterWidthEven; i++) { 
			for(int j = 0; j < gaborFilterWidthEven; j++) { 
				cout << gaborData[i*gaborFilterWidthEven+j] << ","; 
			} 
			cout << endl; 
		} 
		// and all the rest happens in the display function... 
		glutMainLoop(); 
	} catch (string err) { 
		cout << err << endl; 
	} 
 
	return 0; 
}