示例#1
0
void
set_tile_image(tileset_t* tileset, int tile_index, image_t* image)
{
	image_t* old_image;
	
	old_image = tileset->tiles[tile_index].image;
	tileset->tiles[tile_index].image = ref_image(image);
	free_image(old_image);
}
示例#2
0
void
set_glyph_image(font_t* font, int codepoint, image_t* image)
{
	image_t*           old_image;
	struct font_glyph* p_glyph;
	
	p_glyph = &font->glyphs[codepoint];
	old_image = p_glyph->image;
	p_glyph->image = ref_image(image);
	p_glyph->width = get_image_width(image);
	p_glyph->height = get_image_height(image);
	free_image(old_image);
}
示例#3
0
float ShapeFit::distanceTransform(const cv::Mat& distMap, const std::vector<float>& params) {
	// create a reference image
	cv::Mat ref_image(distMap.size(), CV_8UC1, cv::Scalar(1));
	cv::rectangle(ref_image, cv::Rect(params[0], params[1], params[2], params[3]), cv::Scalar(0), 1, 4);

	// compute a distance map
	cv::Mat ref_distMap;
	cv::distanceTransform(ref_image, ref_distMap, CV_DIST_L2, 3);
	ref_distMap.convertTo(ref_distMap, CV_32F);

	//cv::imwrite("ref_distMap.png", ref_distMap);
	
	// compute the squared difference
	cv::Mat tmp;
	cv::reduce((distMap - ref_distMap).mul(distMap - ref_distMap), tmp, 0, CV_REDUCE_SUM);
	cv::reduce(tmp, tmp, 1, CV_REDUCE_SUM);

	return tmp.at<float>(0, 0);
}
示例#4
0
font_t*
clone_font(const font_t* src_font)
{
	font_t*                  font = NULL;
	int                      max_x = 0, max_y = 0;
	int                      min_width = INT_MAX;
	const struct font_glyph* src_glyph;

	uint32_t i;

	console_log(2, "cloning font #%u from source font #%u", s_next_font_id, src_font->id);
	
	if (!(font = calloc(1, sizeof(font_t)))) goto on_error;
	if (!(font->glyphs = calloc(src_font->num_glyphs, sizeof(struct font_glyph))))
		goto on_error;
	font->num_glyphs = src_font->num_glyphs;

	// perform the clone
	get_font_metrics(src_font, &min_width, &max_x, &max_y);
	font->height = max_y;
	font->min_width = min_width;
	font->max_width = max_x;
	for (i = 0; i < src_font->num_glyphs; ++i) {
		src_glyph = &src_font->glyphs[i];
		font->glyphs[i].image = ref_image(src_glyph->image);
		font->glyphs[i].width = src_glyph->width;
		font->glyphs[i].height = src_glyph->height;
	}

	font->id = s_next_font_id++;
	return ref_font(font);

on_error:
	if (font != NULL) {
		for (i = 0; i < font->num_glyphs; ++i) {
			if (font->glyphs[i].image != NULL)
				free_image(font->glyphs[i].image);
		}
		free(font->glyphs);
		free(font);
	}
	return NULL;
}
示例#5
0
void SingleParticle2dx::Methods::BasicCalcCCMethod::calculateCrossCorrelation( SingleParticle2dx::DataStructures::Particle& part, SingleParticle2dx::DataStructures::Projection2d& proj, real_array2d_type& res)
{
    value_type nx = part.getSizeX();
    value_type ny = part.getSizeY();

    fft_array2d_type fft_data( boost::extents[nx][ny] );

    real_array2d_type real_data( boost::extents[nx][ny] );
    real_array2d_type real_data_shifted( boost::extents[nx][ny] );

    fft_type part_image(0,0);
    fft_type ref_image(0,0);
    value_type r2;
    value_type w;

    SingleParticle2dx::ConfigContainer* config = SingleParticle2dx::ConfigContainer::Instance();

    for (size_type i=0; i<part.getSizeX(); i++)
    {
        for (size_type j=0; j<part.getSizeY(); j++)
        {
            r2 = sqrt( (i-nx/2)*(i-nx/2) + (j-ny/2)*(j-ny/2) );
            {
                if ( (r2<config->getMaxCCFreq()) && (r2>config->getMinCCFreq()) )
                {
                    w = 1;
                }
                else if ( r2<(config->getMaxCCFreq()+config->getCCFreqSigma()) )
                {
                    value_type dr = r2-config->getMaxCCFreq();
                    w = 1 - dr/config->getCCFreqSigma();
                }
                else
                {
                    w = 0;
                }

                part_image = part(i,j);
                ref_image = proj(i,j);
                fft_data[i][j].real(part_image.real() * ref_image.real() + part_image.imag() * ref_image.imag());
                fft_data[i][j].imag(-part_image.real() * ref_image.imag() + part_image.imag() * ref_image.real());

                fft_data[i][j] *= w;
            }
        }
    }

    SingleParticle2dx::Utilities::FFTCalculator::performBackwardFFT (&fft_data, &real_data);

    size_type half_window = floor(SingleParticle2dx::ConfigContainer::Instance()->getCrossCorrelationWindowSize()/2.);

    int ii,jj;
    for (int i=0; i<nx; i++)
    {
        for (int j=0; j<ny; j++)
        {
            ii = i - nx/2;
            jj = j - nx/2;

            if (ii<0)
            {
                ii += nx;
            }

            if (jj<0)
            {
                jj += ny;
            }

            if (ii >= nx)
            {
                ii -= nx;
            }

            if (jj >= ny)
            {
                jj -= ny;
            }

            real_data_shifted[i][j] = real_data[ii][jj] / nx;
        }
    }

    res = real_data_shifted[boost::indices[range(nx/2-half_window,nx/2+half_window+1)][range(ny/2-half_window,ny/2+half_window+1)]];

}