示例#1
0
//Input: Saturation channel from HSV image
void imageToGpu(){
	clock_t read_start = clock();
	
	// Pre load pixel data
	printf("starting pixel data filling\n");
	for(int i = 0; i < MAIN_TEXTURE_HEIGHT; i++){
		for(int j = 0; j < PIC_WIDTH; j++){
			if (j < PIC_WIDTH/2)
				pixelData[PIC_WIDTH/2*i + j] = image.at<uchar>(i, j);
			else
				pixelData2[PIC_WIDTH/2*i + (j - PIC_WIDTH/2)] = image.at<uchar>(i, j);	
		}		
	}
	printf("after pixel data\n");		

	pic_data = (void*)pixelData;
	pic_data2 = (void*)pixelData2;
	printf("time passed for reading image: %f\n", (float)(clock() - read_start)/CLOCKS_PER_SEC );


	//Pass data to texture
	const uint8_t* data = (const uint8_t*)pic_data;
	const uint8_t* data2 = (const uint8_t*)pic_data2;
	ytexture.SetPixels(data);
	ytexture2.SetPixels(data2);
}
示例#2
0
//Only call after filling mediantexture
void gpuEdge(){
	DrawSobelRect(&mediantexture,-1.f,-1.f,1.f,1.f,&greysobeltexture);
	DrawSobelRect(&mediantexture2,-1.f,-1.f,1.f,1.f,&greysobeltexture2);
	concat1 = greysobeltexture.Save("tex_sobel.png", "sobel", output1);
	concat2 = greysobeltexture2.Save("tex_sobel2.png", "sobel", output2);
	hconcat(concat1, concat2, outputImage);		

}
示例#3
0
void gpuBlur()
{
	
	clock_t begin_proc = clock();
	DrawMedianRect(&ytexture,-1.f,-1.f,1.f,1.f,&mediantexture);
	printf("median time: %f\n", (float)(clock() - begin_proc)/CLOCKS_PER_SEC );
	DrawMedianRect(&ytexture2,-1.f,-1.f,1.f,1.f,&mediantexture2);
	printf("median time: %f\n", (float)(clock() - begin_proc)/CLOCKS_PER_SEC );

	clock_t debug_time = clock();
	concat1 = mediantexture.Save("tex_blur.png", "blur", output1);
	concat2 = mediantexture2.Save("tex_blur2.png", "blur", output2);
	hconcat(concat1, concat2, outputImage);		
	if (debug) imwrite("out.jpg", outputImage);	
	printf("concat time: %f\n", (float)(clock() - debug_time)/CLOCKS_PER_SEC );	
}
	void GfxGraphicsCommandList::ResourceBarrier(
		GfxTexture& texture,
		GfxResourceStates before,
		GfxResourceStates after,
		GfxResourceBarrierFlag flag)
	{
		m_base->ResourceBarrier(
			texture.GetBaseTexture()->GetNativeResource(),
			before,
			after,
			flag);
	}
示例#5
0
void cam_update()
{
	
	// <------------------------------------------------ Wait for new image to appear ----------------------------------------------> 
		while(!cam->BeginReadFrame(0,frame_data,frame_sz)) {};
		
		digitalWrite(PIN_TCAP, HIGH) ;
		
		// <----------------lock the chosen frame buffer, and copy it directly into the corresponding open gl texture ----------------> 
			data = (const uint8_t*)frame_data;
			ypitch = MAIN_TEXTURE_WIDTH;
			ysize = ypitch*MAIN_TEXTURE_HEIGHT;
			uvpitch = MAIN_TEXTURE_WIDTH/2;
			uvsize = uvpitch*MAIN_TEXTURE_HEIGHT/2;
			upos = ysize;
			vpos = upos+uvsize;
			ytexture.SetPixels(data);
			utexture.SetPixels(data+upos);
			vtexture.SetPixels(data+vpos);
			cam->EndReadFrame(0);

}
	int GfxGraphicsCommandList::UploadTexture(
		GfxDevice& device,
		GfxTexture& targetTexture,
		const void* srcBuffer,
		size_t srcBufferSize,
		GfxResourceState before,
		GfxResourceState after)
	{
		return m_base->UploadTexture(
			*device.GetBaseDevice(),
			*targetTexture.GetBaseTexture(),
			srcBuffer,
			srcBufferSize,
			before,
			after);
	}
示例#7
0
int gpuInit(){


	//initialize graphics and the camera
	InitGraphics();
	cout << "graphics initialized" << endl;

	ytexture.CreateGreyScale(PIC_WIDTH/2,MAIN_TEXTURE_HEIGHT);
	ytexture2.CreateGreyScale(PIC_WIDTH/2,MAIN_TEXTURE_HEIGHT);
		
	
	greysobeltexture.CreateRGBA(PIC_WIDTH/2, MAIN_TEXTURE_HEIGHT);
	greysobeltexture.GenerateFrameBuffer();

	greysobeltexture2.CreateRGBA(PIC_WIDTH/2, MAIN_TEXTURE_HEIGHT);
	greysobeltexture2.GenerateFrameBuffer();
	

	mediantexture.CreateRGBA(PIC_WIDTH/2, MAIN_TEXTURE_HEIGHT);
	mediantexture.GenerateFrameBuffer();

	mediantexture2.CreateRGBA(PIC_WIDTH/2, MAIN_TEXTURE_HEIGHT);
	mediantexture2.GenerateFrameBuffer();


	background = imread("background.jpg");
	
	if (background.empty()){
		cout << "reference image not found" << endl;
		return LOAD_ERROR; 	
	}
	int imgSize = background.total();
	
	
	//Allocate buffers for pixel Data and U and V fillings
	//Needs "zeros" to fill YUV image
	pixelData = new uchar[imgSize/2];
	pixelData2 = new uchar[imgSize/2];
	zeros = new uchar[imgSize];
	
	for(int i =0; i < background.rows; i++)
		for(int j = 0; j < background.cols; j++){
			zeros[background.cols*i + j] = 125;
		}


	//Fixes bit allignment problems
	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
	glPixelStorei(GL_PACK_ALIGNMENT, 1);
	
	//Allocate output pixel data
	output1 = malloc(greysobeltexture.GetWidth()*greysobeltexture.GetHeight()*4);
	output2 = malloc(greysobeltexture.GetWidth()*greysobeltexture.GetHeight()*4);

	return 0;
}
示例#8
0
void init_opengl_fcns ()
{
	cout << " Initializing OpenGL Graphics Library"<<endl;
	// <------------------------------------------------ Generate textures for image processing in OpenGL ----------------------------------------------> 

	ytexture.CreateGreyScale(MAIN_TEXTURE_WIDTH,MAIN_TEXTURE_HEIGHT);
	utexture.CreateGreyScale(MAIN_TEXTURE_WIDTH/2,MAIN_TEXTURE_HEIGHT/2);
	vtexture.CreateGreyScale(MAIN_TEXTURE_WIDTH/2,MAIN_TEXTURE_HEIGHT/2);

	hsv.CreateRGBA(MAIN_TEXTURE_WIDTH/2,MAIN_TEXTURE_HEIGHT/2);
	hsv.GenerateFrameBuffer();

	gray.CreateRGBA(MAIN_TEXTURE_WIDTH/2,MAIN_TEXTURE_HEIGHT/2);
	gray.GenerateFrameBuffer();

	tex.CreateRGBA(MAIN_TEXTURE_WIDTH/2,MAIN_TEXTURE_HEIGHT/2);
	tex.GenerateFrameBuffer();
	
	lab.CreateRGBA(MAIN_TEXTURE_WIDTH/2,MAIN_TEXTURE_HEIGHT/2);
	lab.GenerateFrameBuffer();
	
	kernel.CreateRGBA(MAIN_TEXTURE_WIDTH/2,MAIN_TEXTURE_HEIGHT/2);
	kernel.GenerateFrameBuffer();
	
	kernelx.CreateRGBA(MAIN_TEXTURE_WIDTH/2,MAIN_TEXTURE_HEIGHT/2);
	kernelx.GenerateFrameBuffer();
	
	kernely.CreateRGBA(MAIN_TEXTURE_WIDTH/2,MAIN_TEXTURE_HEIGHT/2);
	kernely.GenerateFrameBuffer();
	
	laplacian.CreateRGBA(MAIN_TEXTURE_WIDTH/2,MAIN_TEXTURE_HEIGHT/2);
	laplacian.GenerateFrameBuffer();
	
	undistort_img.CreateRGBA(MAIN_TEXTURE_WIDTH/2,MAIN_TEXTURE_HEIGHT/2);
	undistort_img.GenerateFrameBuffer();
	
	cout<<"Completed initializing OpenGL Graphics"<<endl<<endl;
}