コード例 #1
0
void
output_handler_max_value_position (OUTPUT_DESC *output,
		int type_call __attribute__ ((unused)) ,
		int mouse_button __attribute__ ((unused)) ,
		int mouse_state __attribute__ ((unused)) )
{
	char *nl_target_coordinates_name = NULL;
	int u, v, u_max, v_max, w, h, xi, yi; //, step;
	float current_value, max_value = FLT_MIN, log_factor;
	NEURON_LAYER *nl_target_coordinates = NULL;
	
	// Gets the output handler parameters
	nl_target_coordinates_name = output->output_handler_params->next->param.sval;
	log_factor = output->output_handler_params->next->next->param.fval;
	
	// Gets the target coordinates neuron layer
	nl_target_coordinates = get_neuron_layer_by_name (nl_target_coordinates_name);
	
	// Gets the Neuron Layer Dimentions
	w = output->neuron_layer->dimentions.x;
	h = output->neuron_layer->dimentions.y;
	
	// Finds the max value position
	for (v = 0, u_max = v_max = 0; v < h; v++)
	{
		for (u = 0; u < w; u++)
		{
			current_value = output->neuron_layer->neuron_vector[v * w + u].output.fval;
			
			if (max_value < current_value)
			{
				max_value = current_value;
				u_max = u;
				v_max = v;
			}
		}
	}
	
	// Map the max value coordinates to image
	map_v1_to_image (&xi, &yi, IMAGE_WIDTH, IMAGE_HEIGHT, u_max, v_max, w, h, 0, 0, (double) h / (double) (h - 1), log_factor);
	
	// Saves the max value position
	nl_target_coordinates->neuron_vector[0].output.fval = (1.0/dynamic_scale_factor) * ( (float) 2*xi);
	nl_target_coordinates->neuron_vector[1].output.fval = (1.0/dynamic_scale_factor) * ( (float) 2*yi);
}
コード例 #2
0
ファイル: robot_filters.c プロジェクト: LCAD-UFES/MAE
// ----------------------------------------------------------------------------
// log_polar_filter -
//
// Entrada: filter_desc - Descritor do filtro
//
// Saida: Nenhuma
// ----------------------------------------------------------------------------
void log_polar_filter (FILTER_DESC *filter_desc)
{
	NEURON_LAYER_LIST *n_list;
	NEURON_LAYER *n_l;
	PARAM_LIST *p_list;
	int i, u, v, h, w, hi, wi, xi, yi, previous_xi, previous_yi, index;
	int x_center, y_center;
	INPUT_DESC *input;
	NEURON_OUTPUT previous_output;
	float fltLogFactor;
	float hAux;
	int nNumParam;

	previous_output.ival = 0;

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

	if (i != 1)
	{
		Erro ("Wrong number of neuron layers. The log_polar_filter filter must be applied on only one neuron layer.", "", "");
		return;
	}
	n_l = filter_desc->neuron_layer_list->neuron_layer;

	// Achar o numero de parametros
	for (nNumParam = 0, p_list = filter_desc->filter_params; p_list != NULL; p_list = p_list->next, nNumParam++);
	nNumParam--;

	// Numero de neuron layers deve ser igual a tres
	if (nNumParam != 1)
	{
		Erro ("The log_polar_filter filter must have one parameter: log_factor.", "", "");
		return;
	}
	fltLogFactor = filter_desc->filter_params->next->param.fval;
// 	printf("fltLogFactor: %f\n", fltLogFactor);

	wi = n_l->dimentions.x;
	hi = n_l->dimentions.y;
	w = filter_desc->output->dimentions.x;
	h = filter_desc->output->dimentions.y;

	input = get_input_by_neural_layer (n_l);

	previous_xi = -1;
	previous_yi = -1;

	if (input == NULL)
	{
		x_center = 0;
		y_center = 0;
	}
	else
	{
		if (TYPE_MOVING_FRAME == STOP)
		{
			x_center = input->wxd - input->wx;
			y_center = input->wyd - input->wy;
		}
		else
		{
			x_center = wi/2;
			y_center = hi/2;
		}
	}

	hAux = (float) h / (float) (h - 1.0);
	for (u = 0; u < w; u++)
	{
		for (v = 0; v < h; v++)
		{
			map_v1_to_image (&xi, &yi, wi, hi, u, v, w, h, x_center, y_center, hAux, fltLogFactor);

			index = (u < (w / 2)) ? ((w / 2) - 1 - u) : (u - (w / 2));
			if ((xi == previous_xi) && (yi == previous_yi))
				filter_desc->output->neuron_vector[(v * w) + u].output = previous_output;
			else
				if (xi >= wi || xi < 0 || yi >= hi || yi < 0)
					previous_output.ival = filter_desc->output->neuron_vector[(v * w) + u].output.ival = 0;
				else
					previous_output = filter_desc->output->neuron_vector[(v * w) + u].output = input->neuron_layer->neuron_vector[yi * wi + xi].output;
			previous_xi = xi;
			previous_yi = yi;
		}
	}
}
コード例 #3
0
void activation_pattern_overlay_filter(FILTER_DESC *filter_desc) {
    PARAM_LIST *p_list = NULL;
    NEURON_LAYER_LIST *n_list = NULL;
    NEURON_LAYER *nl_output = NULL, *nl_input = NULL, *nl_act_pattern = NULL;
    int nl_number, p_number;
    float log_factor;
    int xi, yi, wi, hi, xo, yo, wo, ho, wa, ha;
    int x_center, y_center;
    float max_value = FLT_MIN;

    // Checks the Neuron Layers Number
    for (nl_number = 0, n_list = filter_desc->neuron_layer_list; n_list != NULL; n_list = n_list->next, nl_number++)
        ;

    // Checks the Parameters Number
    for (p_number = 0, p_list = filter_desc->filter_params; p_list != NULL; p_list = p_list->next, p_number++)
        ;

    if (p_number != 2) {
        Erro("Error: Wrong number of parameters. The activation_pattern_overlay_filter needs one parameter: <log_factor>.", "", "");
        return;
    }

    // Gets the filter parameters
    log_factor = filter_desc->filter_params->next->param.fval;

    // Gets the Input Neuron Layer
    nl_input = filter_desc->neuron_layer_list->neuron_layer;
    // Gets the Activation Pattern Layer
    nl_act_pattern = filter_desc->neuron_layer_list->next->neuron_layer;
    // Gets the Filter Output
    nl_output = filter_desc->output;

    // Input layer
    wi = nl_input->dimentions.x;
    hi = nl_input->dimentions.y;
    x_center = wi / 2;
    y_center = hi / 2;

    // Activation layer
    wa = nl_act_pattern->dimentions.x;
    ha = nl_act_pattern->dimentions.y;

    // Output layer
    wo = nl_output->dimentions.x;
    ho = nl_output->dimentions.y;

    // Copies the neuron layer data
    for (yo = 0; yo < ho; yo++)
        for (xo = 0; xo < wo; xo++)
            nl_output->neuron_vector[xo + yo * wo].output = nl_input->neuron_vector[xo + yo * wo].output;

    //Search for the activation layer max value
    //TODO: If not initialized, the "nl_act_pattern->neuron_vector" could cause context errors
    for (yo = 0; yo < ha; yo++)
        for (xo = 0; xo < wa; xo++)
            if (max_value < nl_act_pattern->neuron_vector[yo * wa + xo].output.fval)
                max_value = nl_act_pattern->neuron_vector[yo * wa + xo].output.fval;

    // Now maps the activated pattern into the image
    for (yo = 0; yo < ha; yo++)
    {
        for (xo = 0; xo < wa; xo++)
        {
            map_v1_to_image(&xi, &yi, wi, hi, xo, yo, wa, ha, x_center, y_center, (double) ha / (double) (ha - 1), log_factor);

            if (!(xi >= wi || xi < 0 || yi >= hi || yi < 0))
            {
                nl_output->neuron_vector[yi * wi + xi].output.ival = float_to_int_grayscale(nl_act_pattern->neuron_vector[yo * wa + xo].output.fval, max_value);

                //if inside neuron layer boundaries
                if(xo > 0 && xo < wa)
                {
                    if(gaussian_filtered_training_pattern)
                    {
                        if( (gaussian_filtered_training_pattern[yo * wa + xo] != 0.0f && gaussian_filtered_training_pattern[yo * wa + xo - 1] == 0.0)
                                ||  (gaussian_filtered_training_pattern[yo * wa + xo] != 0.0f && gaussian_filtered_training_pattern[yo * wa + xo + 1] == 0.0) )
                        {
                            nl_output->neuron_vector[yi * wi + xi].output.ival = 0x000000ff;
                        }
                    }

                }

                //previous_output = nl_output->neuron_vector[yi * wi + xi].output;
            }
        }
    }
}
コード例 #4
0
ファイル: robot_filters.c プロジェクト: LCAD-UFES/MAE
// ----------------------------------------------------------------------------
// image_fusion_filter -
//
// Entrada: filter_desc - Descritor do filtro
//
// Saida: Nenhuma
// ----------------------------------------------------------------------------
void image_fusion_filter (FILTER_DESC *filter_desc)
{
	NEURON_LAYER_LIST *n_list;
	PARAM_LIST *p_list = NULL;
	static INPUT_DESC *input_right, *input_left;
	static NEURON_LAYER *nl_input_left, *nl_input_right, *nl_disparity_map;
	static NEURON_LAYER *filter_output = NULL;
	static int flagInit = 0;
	static int wo, ho, wi, hi, w, h;
	static float fltLogFactor;
	static float hAux;
	int nNumNL, nNumParam;
	int u, v, xi, yi, xi_left, yi_left, x_center, y_center, x_center_left, y_center_left;
	int nRed, nGreen, nBlue;
	int nPixelLeft, nPixelRight;
//	int nDispXVergOffset;
	float fltDisparity;
	
	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++);
	
		// Numero de neuron layers deve ser igual a tres
		if (nNumNL != 3)
		{
			Erro ("The image_fusion_filter must have three neuron layers: image_left, image_right and disparity_map.", "", "");
			return;
		}
		nl_input_left = filter_desc->neuron_layer_list->neuron_layer;
		nl_input_right = filter_desc->neuron_layer_list->next->neuron_layer;
		nl_disparity_map = filter_desc->neuron_layer_list->next->next->neuron_layer;

		// Achar o numero de parametros
		for (nNumParam = 0, p_list = filter_desc->filter_params; p_list != NULL; p_list = p_list->next, nNumParam++);
		nNumParam--;

		// Numero de neuron layers deve ser igual a tres
		if (nNumParam != 1)
		{
			Erro ("The image_fusion_filter must have one parameter: log_factor.", "", "");
			return;
		}
		fltLogFactor = filter_desc->filter_params->next->param.fval;
		printf("fltLogFactor: %f\n", fltLogFactor);

		// 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;

		// Dimensao das neuron layers de entrada
		wi = nl_input_right->dimentions.x;
		hi = nl_input_right->dimentions.y;

		// Dimensao do mapa de disparidade
		w = nl_disparity_map->dimentions.x;
		h = nl_disparity_map->dimentions.y;
		hAux = (float) h / (h - 1);

		input_right = get_input_by_neural_layer (nl_input_right);
		input_left = get_input_by_neural_layer (nl_input_left);

		flagInit = 1;
	}

	// NAO SEI PORQUE.
	// PRECISA DISTO PARA FUNCIONAR DEVIDO A ALTERACAO FEITA POR DIJALMA
	if (TYPE_MOVING_FRAME == STOP)
	{
		x_center = input_right->wxd - input_right->wx;
		y_center = input_right->wyd - input_right->wy;
		x_center_left = input_left->wxd - input_left->wx;
		y_center_left = input_left->wyd - input_left->wy;
	}
	else
	{
		x_center = wi/2;
		y_center = hi/2;
		x_center_left = wi/2;
		y_center_left = hi/2;
	}

	// Zera a saida
	for (u = 0; u < (wo * ho); u++)
		filter_output->neuron_vector[u].output.ival = 0;

	// Percorre a disparity_map
	for (u = 0; u < w; u++)
	{
		for (v = 0; v < h; v++)
		{
			// Mapeamento logpolar->plano
			map_v1_to_image (&xi, &yi, wi, hi, u, v, w, h, x_center, y_center, hAux, fltLogFactor);

			if (xi >= wi || xi < 0 || yi >= hi || yi < 0)
				continue;

			switch (nl_disparity_map->output_type)
			{
				case GREYSCALE:
				{
					fltDisparity = (float) nl_disparity_map->neuron_vector[(v * w) + u].output.ival;
				}
				break;
				
				case GREYSCALE_FLOAT:
				{
					fltDisparity = nl_disparity_map->neuron_vector[(v * w) + u].output.fval;
				}
				break;
			}

			// Achar a coordenada relativa na imagem esquerda
			map_v1_to_image (&xi_left, &yi_left, wi, hi, u, v, w, h, x_center_left, y_center_left, hAux, fltLogFactor);
			xi_left += (int) fltDisparity;

			if (xi_left >= wi || xi_left < 0 || yi_left >= hi || yi_left < 0)
				continue;

			nPixelRight = nl_input_right->neuron_vector[(yi * wi) + xi].output.ival;
			nPixelLeft = nl_input_left->neuron_vector[(yi_left * wi) + xi_left].output.ival;

			nRed = (RED(nPixelLeft) + RED(nPixelRight)) / 2;
			nGreen = (GREEN(nPixelLeft) + GREEN(nPixelRight)) / 2;
			nBlue = (BLUE(nPixelLeft) + BLUE(nPixelRight)) / 2;

			filter_output->neuron_vector[(yi * wo) + xi].output.ival = PIXEL(nRed, nGreen, nBlue);
		}
	}
}
コード例 #5
0
void
scaled_map_image_v1(FILTER_DESC *filter_desc) {
    NEURON_LAYER_LIST *n_list = NULL;
    PARAM_LIST *p_list = NULL;
    NEURON_LAYER *n_l = NULL;
    INPUT_DESC *input = NULL;
    int i, u, v, h, w, hi, wi, xi, yi, previous_xi, previous_yi;
    int x_center, y_center;
    float log_factor, scale_factor;
    NEURON_OUTPUT previous_output;

    previous_output.ival = 0;

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

    if (i != 1) {
        Erro("Wrong number of neuron layers. Map Image V1 filter must be applied on only one neuron layer.", "", "");
        return;
    }

    n_l = filter_desc->neuron_layer_list->neuron_layer;

    // Check Param
    for (i = 0, p_list = filter_desc->filter_params; p_list != NULL; p_list = p_list->next, i++)
        ;

    // 4 Parameters are passed to this filter
    if (i != 4) {
        Erro("Wrong number of parameters. Map Image V1 needs three parameters: <input name>, <log_factor>, <scale_factor>.", "", "");
        return;
    }

    input = get_input_by_name(filter_desc->filter_params->next->param.sval);
    log_factor = filter_desc->filter_params->next->next->param.fval;
    scale_factor = filter_desc->filter_params->next->next->next->param.fval;

    wi = n_l->dimentions.x;
    hi = n_l->dimentions.y;
    w = filter_desc->output->dimentions.x;
    h = filter_desc->output->dimentions.y;

    previous_xi = -1;
    previous_yi = -1;

    if (input == NULL) {
        x_center = 0;
        y_center = 0;
    } else {
        if (TYPE_MOVING_FRAME == STOP) {
            x_center = input->wxd - input->wx;
            y_center = input->wyd - input->wy;
        } else {
            x_center = wi / 2;
            y_center = hi / 2;
        }
    }

    for (u = 0; u < w; u++) {
        for (v = 0; v < h; v++) {
            map_v1_to_image(&xi, &yi, wi, hi, u, v, w, h, x_center, y_center, (double) h / (double) (h - 1), log_factor);

            // Adjust "xi" and "yi" according to the scale factor
            xi = x_center + (xi - x_center)*(1.0 / scale_factor);
            yi = y_center + (yi - y_center)*(1.0 / scale_factor);

            if ((xi == previous_xi) && (yi == previous_yi))
                filter_desc->output->neuron_vector[(v * w) + u].output = previous_output;
            else if (xi >= wi || xi < 0 || yi >= hi || yi < 0)
                previous_output.ival = filter_desc->output->neuron_vector[(v * w) + u].output.fval = 0;
            else
                previous_output = filter_desc->output->neuron_vector[(v * w) + u].output = n_l->neuron_vector[yi * wi + xi].output;

            previous_xi = xi;
            previous_yi = yi;
        }
    }
}