コード例 #1
0
ファイル: simulator.c プロジェクト: Farranco/HyperopicBarcode
void compute_kernel(Simulator *sim)
{
	// printf("compute_kernel...\n");
	sim->kernel_width = cvRound(6 * sim->sigma) + 1;
	if (sim->kernel_width > MAX_KERNEL_WIDTH)
		sim->kernel_width = MAX_KERNEL_WIDTH;
	if (sim->kernel_width % 2 == 0)
		sim->kernel_width--;
	compute_gaussian_kernel(sim->kernel_width, sim->kernel, sim->sigma);
}
コード例 #2
0
ファイル: api_filters.c プロジェクト: Forzaferrarileo/mesa
void vegaGaussianBlur(VGImage dst, VGImage src,
                      VGfloat stdDeviationX,
                      VGfloat stdDeviationY,
                      VGTilingMode tilingMode)
{
   struct vg_context *ctx = vg_current_context();
   struct vg_image *d, *s;
   VGfloat *buffer, *kernel;
   VGint kernel_width, kernel_height, kernel_size;
   VGint buffer_len;
   VGint idx, i, j;
   struct filter_info info;

   if (dst == VG_INVALID_HANDLE || src == VG_INVALID_HANDLE) {
      vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
      return;
   }
   if (stdDeviationX <= 0 || stdDeviationY <= 0) {
      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
      return;
   }

   if (tilingMode < VG_TILE_FILL ||
       tilingMode > VG_TILE_REFLECT) {
      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
      return;
   }

   d = handle_to_image(dst);
   s = handle_to_image(src);

   if (vg_image_overlaps(d, s)) {
      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
      return;
   }

   kernel_width = compute_kernel_size(stdDeviationX);
   kernel_height = compute_kernel_size(stdDeviationY);
   kernel_size = kernel_width * kernel_height;
   kernel = malloc(sizeof(VGfloat)*kernel_size);
   compute_gaussian_kernel(kernel, kernel_width, kernel_height,
                           stdDeviationX, stdDeviationY);

   buffer_len = 8 + 2 * 4 * kernel_size;
   buffer = malloc(buffer_len * sizeof(VGfloat));

   buffer[0] = 0.f;
   buffer[1] = 1.f;
   buffer[2] = 2.f; /*unused*/
   buffer[3] = 4.f; /*unused*/

   buffer[4] = kernel_width * kernel_height;
   buffer[5] = 1.f;/*scale*/
   buffer[6] = 0.f;/*bias*/
   buffer[7] = 0.f;

   idx = 8;
   for (j = 0; j < kernel_height; ++j) {
      for (i = 0; i < kernel_width; ++i) {
         VGint index = j * kernel_width + i;
         VGfloat x, y;

         x = texture_offset(s->width, kernel_width, i, kernel_width/2);
         y = texture_offset(s->height, kernel_height, j, kernel_height/2);

         buffer[idx + index*4 + 0] = x;
         buffer[idx + index*4 + 1] = y;
         buffer[idx + index*4 + 2] = 0.f;
         buffer[idx + index*4 + 3] = 0.f;
      }
   }
   idx += kernel_size * 4;

   for (j = 0; j < kernel_height; ++j) {
      for (i = 0; i < kernel_width; ++i) {
         /* transpose the kernel */
         VGint index = j * kernel_width + i;
         VGint kindex = (kernel_width - i - 1) * kernel_height + (kernel_height - j - 1);
         buffer[idx + index*4 + 0] = kernel[kindex];
         buffer[idx + index*4 + 1] = kernel[kindex];
         buffer[idx + index*4 + 2] = kernel[kindex];
         buffer[idx + index*4 + 3] = kernel[kindex];
      }
   }

   info.dst = d;
   info.src = s;
   info.setup_shader = &setup_convolution;
   info.user_data = (void*)(long)(buffer_len/4);
   info.const_buffer = buffer;
   info.const_buffer_len = buffer_len * sizeof(VGfloat);
   info.tiling_mode = tilingMode;
   info.extra_texture_view = NULL;
   execute_filter(ctx, &info);

   free(buffer);
   free(kernel);
}
コード例 #3
0
ファイル: robot_filters.c プロジェクト: LCAD-UFES/MAE
// ----------------------------------------------------------------------------
// min_avarage_association2_filter -
//
// Entrada: filter_desc - Descritor do filtro
//
// Saida: Nenhuma
// ----------------------------------------------------------------------------
void min_avarage_association2_filter (FILTER_DESC *filter_desc)
{
	NEURON_LAYER_LIST *n_list = NULL;
	NEURON_LAYER *nl = NULL;
	PARAM_LIST *p_list = NULL;
	static RECEPTIVE_FIELD_DESCRIPTION receptive_field_descriptor;
	static NEURON_LAYER *filter_output = NULL;
	static int nNumNL, nNumParam;
	static int flagInit = 0;
	static float *fltMinAvarageValue;
	static int wo, ho;
	float fltDisparity;
	int i, x, y;
	float fltAvgDisparity, fltAux;
	float fltSigma;
	int nKernelSize;

	if (!flagInit)
	{
		// Achar o numero de neuron layers
		for (nNumNL = 0, n_list = filter_desc->neuron_layer_list; n_list != NULL; n_list = n_list->next, nNumNL++);
//		nNumNL--;
//		printf("nNumNL: %d\n", nNumNL);
	
		// Achar o numero de parametros
		for (nNumParam = 0, p_list = filter_desc->filter_params; p_list != NULL; p_list = p_list->next, nNumParam++);
		nNumParam--;
//		printf("nNumParam: %d\n", nNumParam);
	
		// Numero de neuron layers deve ser igual ao numero de parametros
		if (nNumNL != (nNumParam-2))
		{
			Erro ("Wrong number of parameters for min_avarage_association2_filter.", "", "");
			return;
		}

		// Buscar o KernelSize e o Sigma
		for (i = 0, p_list = filter_desc->filter_params; i <= nNumNL; p_list = p_list->next, i++);
		nKernelSize = p_list->param.ival;
		fltSigma = p_list->next->param.fval;

		// Ponteiro para a 'output' associada ao filtro
		filter_output = filter_desc->output;

		// Dimensao da 'output' associada ao filtro
		wo = filter_output->dimentions.x;
		ho = filter_output->dimentions.y;
		
		// Alocar espaco auxiliar
		fltMinAvarageValue = (float*)malloc(sizeof(float)*wo*ho);

		// Inicializa o kernel com a gausiana
		compute_gaussian_kernel(&receptive_field_descriptor, nKernelSize, fltSigma);

		flagInit = 1;
	}

	for (x = 0; x < wo * ho; x++)
	{
		fltMinAvarageValue[x] = 0.0;

		switch (filter_output->output_type)
		{
			case GREYSCALE:
			{
				filter_output->neuron_vector[x].output.ival = 0;
			}
			break;
			
			case GREYSCALE_FLOAT:
			{
				filter_output->neuron_vector[x].output.fval = 0.0;
			}
			break;
		}
	}
	
	// Copia a primeira camada neural
	n_list = filter_desc->neuron_layer_list;
	p_list = filter_desc->filter_params->next;
	nl = n_list->neuron_layer;

	// Percorre as proximas neuron layers (se houver)
	for (i = 0; i < nNumNL; n_list = n_list->next, p_list = p_list->next, i++)
	{
		nl = n_list->neuron_layer;
		fltDisparity = (float) p_list->param.ival;

		for (x = 0; x < wo; x++)
		{
			for (y = 0; y < ho; y++)
			{
				fltAux = apply_gaussian_kernel(&receptive_field_descriptor, nl, x, y);

				// RTBC
				if (fltAux == 0.0)
					fltAux = 0.000001;
					
				fltMinAvarageValue[y * wo + x] += 1.0 / (fltAux * fltAux);

				filter_output->neuron_vector[y * wo + x].output.fval += fltDisparity / (fltAux * fltAux);
			}
		}
	}
	
	for (x = 0; x < wo * ho; x++)
	{
		switch (filter_output->output_type)
		{
			case GREYSCALE:
			{
				filter_output->neuron_vector[x].output.ival = filter_output->neuron_vector[x].output.fval / fltMinAvarageValue[x];
			}
			break;
			
			case GREYSCALE_FLOAT:
			{
				filter_output->neuron_vector[x].output.fval = filter_output->neuron_vector[x].output.fval / fltMinAvarageValue[x];
			}
			break;
		}
	}
	// Imprime a media
	switch (filter_output->output_type)
	{
		case GREYSCALE:
		{
			for (i = 0, fltAvgDisparity = 0.0; i < wo*ho; fltAvgDisparity += (float) filter_output->neuron_vector[i].output.ival, i++);
		}
		break;
		
		case GREYSCALE_FLOAT:
		{
			for (i = 0, fltAvgDisparity = 0.0; i < wo*ho; fltAvgDisparity += filter_output->neuron_vector[i].output.fval, i++);
		}
		break;
	}
	fltAvgDisparity /= wo*ho;
	printf("Avarage disparity = %.2f\n", fltAvgDisparity);
}
コード例 #4
0
ファイル: robot_filters.c プロジェクト: LCAD-UFES/MAE
void robot_gaussian_filter (FILTER_DESC *filter_desc)
{
	NEURON_LAYER_LIST *n_list;
	NEURON_LAYER *nl;
	RECEPTIVE_FIELD_DESCRIPTION *receptive_field;
	PARAM_LIST *p_list;
	int i, j;
	int wo, ho, nKernelSize;
	float fltSigma;

	for (i = 0, n_list = filter_desc->neuron_layer_list; n_list != NULL; n_list = n_list->next, i++);

	if (filter_desc->private_state == NULL)
	{
		if (i != 1) 
		{
			Erro ("Wrong number of neuron layers. The robot_gaussian_filter must be applied on only one neuron layer.", "", "");
			return;
		}
	
		if (filter_desc->neuron_layer_list->neuron_layer->output_type != filter_desc->output->output_type)
		{
			Erro ("The output type of input neuron layer is different of the robot_gaussian_filter output.", "", "");
			return;
		}

		// Buscar o KernelSize e o Sigma
		for (i = 0, p_list = filter_desc->filter_params; p_list != NULL; p_list = p_list->next, i++);
		i--;

		if (i != 2) 
		{
			Erro ("Wrong number of parameters. The robot_gaussian_filter have 2 parameters: kernel_size and sigma respectivally.", "", "");
			return;
		}

		nKernelSize	= filter_desc->filter_params->next->param.ival;
		fltSigma	= filter_desc->filter_params->next->next->param.fval;

		receptive_field = (RECEPTIVE_FIELD_DESCRIPTION*)malloc(sizeof(RECEPTIVE_FIELD_DESCRIPTION));
		compute_gaussian_kernel(receptive_field, nKernelSize, fltSigma);

		filter_desc->private_state = (void*)receptive_field;
	}

	receptive_field = (RECEPTIVE_FIELD_DESCRIPTION*)filter_desc->private_state;
	nl = filter_desc->neuron_layer_list->neuron_layer;

	wo = filter_desc->output->dimentions.x;
	ho = filter_desc->output->dimentions.y;

	switch (filter_desc->output->output_type)
	{
		case GREYSCALE:
		{
			for (i = 0; i < wo; i++)
			{
				for (j = 0; j < ho; j++)
				{
					filter_desc->output->neuron_vector[j * wo + i].output.ival = (int)apply_gaussian_kernel(receptive_field, nl, i, j);
				}
			}
		}
		break;

		case GREYSCALE_FLOAT:
		{
			for (i = 0; i < wo; i++)
			{
				for (j = 0; j < ho; j++)
				{
					filter_desc->output->neuron_vector[j * wo + i].output.fval = apply_gaussian_kernel(receptive_field, nl, i, j);
				}
			}
		}
		break;
	}
}
コード例 #5
0
ファイル: robot_filters.c プロジェクト: LCAD-UFES/MAE
// ----------------------------------------------------------------------------
// min_avarage_association_interpolation_filter -
//
// Entrada: filter_desc - Descritor do filtro
//
// Saida: Nenhuma
// ----------------------------------------------------------------------------
void min_avarage_association_interpolation_filter (FILTER_DESC *filter_desc)
{
	NEURON_LAYER_LIST *n_list, *n_list_previous, *n_list_next;
	NEURON_LAYER *nl;
	PARAM_LIST *p_list, *p_list_previous, *p_list_next;
	static RECEPTIVE_FIELD_DESCRIPTION receptive_field_descriptor;
	static NEURON_LAYER *filter_output = NULL;
	static int nNumNL, nNumParam;
	static int flagInit = 0;
	static float *fltMinAvarageValue;
	static int wo, ho;
	float fltDisparity;
	static float fltMinDisparity, fltMaxDisparity;
	int i, x, y;
	float fltAvgDisparity, fltAux;
	float fltSigma;
	int nKernelSize;
	float x0, y0, x1, y1, x2, y2;

	if (!flagInit)
	{
		// Achar o numero de neuron layers
		for (nNumNL = 0, n_list = filter_desc->neuron_layer_list; n_list != NULL; n_list = n_list->next, nNumNL++);
//		nNumNL--;
//		printf("nNumNL: %d\n", nNumNL);
	
		// Achar o numero de parametros
		for (nNumParam = 0, p_list = filter_desc->filter_params; p_list != NULL; p_list = p_list->next, nNumParam++);
		nNumParam--;
//		printf("nNumParam: %d\n", nNumParam);
	
		// Numero de neuron layers deve ser igual ao numero de parametros
		if (nNumNL != (nNumParam-2))
		{
			Erro ("Wrong number of parameters for min_avarage_association_interpolation_filter.", "", "");
			return;
		}

		// Buscar o KernelSize e o Sigma
		for (i = 0, p_list = filter_desc->filter_params; i <= nNumNL; p_list = p_list->next, i++);
		nKernelSize = p_list->param.ival;
		fltSigma = p_list->next->param.fval;

		// Busca a menor e a maior disparidade
		fltMinDisparity = (float) filter_desc->filter_params->next->param.ival;
		for (i = 0, p_list = filter_desc->filter_params->next; i <= (nNumNL - 2); p_list = p_list->next, i++);
		fltMaxDisparity = (float) p_list->param.ival;
		printf("fltMinDisparity: %f - fltMaxDisparity: %f\n", fltMinDisparity, fltMaxDisparity);

		// Ponteiro para a 'output' associada ao filtro
		filter_output = filter_desc->output;

		// Dimensao da 'output' associada ao filtro
		wo = filter_output->dimentions.x;
		ho = filter_output->dimentions.y;
		
		// Alocar espaco auxiliar
		fltMinAvarageValue = (float*)malloc(sizeof(float)*wo*ho);

		// Inicializa o kernel com a gausiana
		compute_gaussian_kernel(&receptive_field_descriptor, nKernelSize, fltSigma);

		flagInit = 1;
	}

	// Copia a primeira camada neural
	n_list = filter_desc->neuron_layer_list;
	p_list = filter_desc->filter_params->next;
	nl = n_list->neuron_layer;
	fltDisparity = (float) p_list->param.ival;

	for (x = 0; x < wo; x++)
	{
		for (y = 0; y < ho; y++)
		{
			fltMinAvarageValue[y * wo + x] = apply_gaussian_kernel(&receptive_field_descriptor, nl, x, y);

			switch (filter_output->output_type)
			{
				case GREYSCALE:
				{
					filter_output->neuron_vector[y * wo + x].output.ival = (int) fltDisparity;
				}
				break;
				
				case GREYSCALE_FLOAT:
				{
					filter_output->neuron_vector[y * wo + x].output.fval = fltDisparity;
				}
				break;
			}
		}
	}

	n_list = n_list->next;
	p_list = p_list->next;

	// Percorre as proximas neuron layers (se houver)
	for (i = 1; i < nNumNL; n_list = n_list->next, p_list = p_list->next, i++)
	{
		nl = n_list->neuron_layer;
		fltDisparity = (float) p_list->param.ival;

		for (x = 0; x < wo; x++)
		{
			for (y = 0; y < ho; y++)
			{
				fltAux = apply_gaussian_kernel(&receptive_field_descriptor, nl, x, y);
				if (fltAux < fltMinAvarageValue[y * wo + x])
				{
					fltMinAvarageValue[y * wo + x] = fltAux;

					switch (filter_output->output_type)
					{
						case GREYSCALE:
						{
							filter_output->neuron_vector[y * wo + x].output.ival = (int) fltDisparity;
						}
						break;
						
						case GREYSCALE_FLOAT:
						{
							filter_output->neuron_vector[y * wo + x].output.fval = fltDisparity;
						}
						break;
					}
				}
			}
		}
	}

	// Vai saber -- Ai fudeu com forca ainda...
	for (i = 0; i < wo * ho; i++)
	{
		fltDisparity = filter_output->neuron_vector[i].output.fval;
		if ((fltDisparity != fltMaxDisparity) && (fltDisparity != fltMinDisparity))
		{
			// Encontrar as neuron_layers com disparidade imediatamente anterior e posterior
			n_list = filter_desc->neuron_layer_list;
			p_list = filter_desc->filter_params->next;
			do
			{
				n_list_previous = n_list;
				n_list = n_list->next;
				n_list_next = n_list->next;
				p_list_previous = p_list;
				p_list = p_list->next;
				p_list_next = p_list->next;
			} while (p_list->param.ival < (int)fltDisparity);

			x0 = (float) p_list_previous->param.ival;
			y0 = (float) n_list_previous->neuron_layer->neuron_vector[i].output.fval;
			x1 = (float) p_list->param.ival;
			y1 = (float) n_list->neuron_layer->neuron_vector[i].output.fval;
			x2 = (float) p_list_next->param.ival;
			y2 = (float) n_list_next->neuron_layer->neuron_vector[i].output.fval;

			if ((y1 < y2) && (y1 < y0))
				filter_output->neuron_vector[i].output.fval = x_min_lagrange(x0, y0, x1, y1, x2, y2);
		}
	}

	// Imprime a media
	switch (filter_output->output_type)
	{
		case GREYSCALE:
		{
			for (i = 0, fltAvgDisparity = 0.0; i < wo*ho; fltAvgDisparity += (float) filter_output->neuron_vector[i].output.ival, i++);
		}
		break;
		
		case GREYSCALE_FLOAT:
		{
			for (i = 0, fltAvgDisparity = 0.0; i < wo*ho; fltAvgDisparity += filter_output->neuron_vector[i].output.fval, i++);
		}
		break;
	}
	fltAvgDisparity /= wo*ho;
	printf("Avarage disparity = %.2f\n", fltAvgDisparity);
}