// from the resample demo
int main (int argc, char** argv) {
  std::string infile = "../../recordings/mark1_pcd/1316652689.744386960.pcd";
  std::string smoothfile = "scan-mls.pcd";
  std::string outmesh = "scan.vtk"; // there's a ply export in pcl 1.2, but ... we don't have that
  if(argc > 1) {
    if(strcmp(argv[1], "-s") == 0) {
      if(access(infile.c_str(), R_OK) >= 0) {
        std::cout << "running Moving Least Squares smoothing, this takes about 30s\n";
        mls(infile, smoothfile);
      } else {
        print_usage();
        std::cout << " ! unable to find " << infile << std::endl;
      }
    } else if(strcmp(argv[1], "-v") == 0) {
      if(access(smoothfile.c_str(), R_OK) >= 0) {
        viz(smoothfile);
      } else {
        print_usage();
        std::cout << " ! unable to find " << smoothfile << std::endl;
      }
    } else if(strcmp(argv[1], "-r") == 0) {
      if(access(smoothfile.c_str(), R_OK) >= 0) {
        std::cout << "running greedy projection, this takes about 4s\n";
        recons(smoothfile, outmesh);
      } else {
        print_usage();
        std::cout << " ! unable to find " << smoothfile << std::endl;
      }
    } else {
      print_usage();
    }
  } else {
    print_usage();
  }
}
Exemple #2
0
void CpuPointSet::construct (size_t num_probes) const
{
  Vector<float> likes(size * num_probes, m_temp_likes_batch);
  Vector<uint8_t> recons(dim * num_probes, m_temp_recons_batch);
  Vector<float> work(Cpu::vq_construct_work_size(dim, num_probes), m_work);

  ASSERT1_LE(sqr(mean(likes) - 1.0f), 1e-8f);
  const float sum_likes = size;
  const float tol = get_construct_tol() * sum_likes;

  Cpu::vq_construct_batch(likes, m_points, recons, work, tol, num_probes);
}
Exemple #3
0
ConstructStats CpuPointSet::construct_deriv (size_t num_probes) const
{
  Vector<float> sd(size * num_probes, m_temp_squared_distances_batch);
  Vector<float> likes(size * num_probes, m_temp_likes_batch);
  Vector<uint8_t> probes(dim * num_probes, m_temp_probes_batch);
  Vector<uint8_t> recons(dim * num_probes, m_temp_recons_batch);
  Vector<float> work(
      Cpu::vq_construct_deriv_work_size(dim, num_probes), m_work);

  ASSERT1_LE(sqr(mean(likes) - 1.0f), 1e-8f);
  const float sum_likes = size;
  const float tol = get_construct_deriv_tol() * sum_likes;

  return Cpu::vq_construct_deriv(
      likes,
      sd,
      probes,
      m_points,
      recons,
      work,
      tol,
      num_probes);
}
Exemple #4
0
void CpuPointSet::fit_points (const Point & probes, size_t num_probes)
{
  ASSERT_SIZE(probes, dim * num_probes);
  ASSERT_LE(num_probes, max_batch_size);

  const size_t num_points = size;

  float max_fit_rate = 1.0f / num_probes;
  float min_fit_rate = get_fit_rate_tol() * get_fit_rate();

  Vector<uint8_t> recons(probes.size, m_temp_recons_batch);
  Vector<float> sd(size * num_probes, m_temp_squared_distances_batch);
  Vector<float> likes(size * num_probes, m_temp_likes_batch);
  Vector<float> fit_rates(size * num_probes, m_fit_rates_batch);
  Vector<float> work(Cpu::fit_points_work_size(dim, size), m_work);

  Cpu::measure_batch(probes, m_points, sd, num_probes);

  m_quantize_stats_accum += Cpu::quantize_batch(
      get_radius(),
      sd,
      likes,
      num_probes);

  m_construct_stats_accum += construct_deriv(num_probes);
  m_count_stats_accum += num_probes;

  accum_prior(num_probes);

  for (size_t i_probe = 0; i_probe < num_probes; ++i_probe) {

    const float * restrict fit_rate_scales = m_fit_rate_scales;
    const float * restrict likes = m_temp_likes_batch + num_points * i_probe;
    float * restrict fit_rates = m_fit_rates_batch + num_points * i_probe;

    for (size_t p = 0; p < num_points; ++p) {
      fit_rates[p] = min(max_fit_rate, fit_rate_scales[p] * likes[p]);
    }
  }

  if (not fitting_points_to_recon()) {

    Cpu::fit_points_to_obs(
        min_fit_rate,
        probes,
        fit_rates,
        m_points,
        work,
        num_probes);

  } else {

    Cpu::fit_points_to_recon(
        get_radius(),
        min_fit_rate,
        probes,
        recons,
        fit_rates,
        m_points,
        work,
        num_probes);
  }
}