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); }
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); }
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); }
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; }
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)]]; }