Example #1
0
int
main (int argc, char **argv)
{
  double dist = 0.1;
  pcl::console::parse_argument (argc, argv, "-d", dist);

  double rans = 0.1;
  pcl::console::parse_argument (argc, argv, "-r", rans);

  int iter = 100;
  pcl::console::parse_argument (argc, argv, "-i", iter);

  pcl::registration::ELCH<PointType> elch;
  pcl::IterativeClosestPoint<PointType, PointType>::Ptr icp (new pcl::IterativeClosestPoint<PointType, PointType>);
  icp->setMaximumIterations (iter);
  icp->setMaxCorrespondenceDistance (dist);
  icp->setRANSACOutlierRejectionThreshold (rans);
  elch.setReg (icp);

  std::vector<int> pcd_indices;
  pcd_indices = pcl::console::parse_file_extension_argument (argc, argv, ".pcd");

  CloudVector clouds;
  for (size_t i = 0; i < pcd_indices.size (); i++)
  {
    CloudPtr pc (new Cloud);
    pcl::io::loadPCDFile (argv[pcd_indices[i]], *pc);
    clouds.push_back (CloudPair (argv[pcd_indices[i]], pc));
    std::cout << "loading file: " << argv[pcd_indices[i]] << " size: " << pc->size () << std::endl;
    elch.addPointCloud (clouds[i].second);
  }

  int first = 0, last = 0;

  for (size_t i = 0; i < clouds.size (); i++)
  {

    if (loopDetection (int (i), clouds, 3.0, first, last))
    {
      std::cout << "Loop between " << first << " (" << clouds[first].first << ") and " << last << " (" << clouds[last].first << ")" << std::endl;
      elch.setLoopStart (first);
      elch.setLoopEnd (last);
      elch.compute ();
    }
  }

  for (const auto &cloud : clouds)
  {
    std::string result_filename (cloud.first);
    result_filename = result_filename.substr (result_filename.rfind ('/') + 1);
    pcl::io::savePCDFileBinary (result_filename.c_str (), *(cloud.second));
    std::cout << "saving result to " << result_filename << std::endl;
  }

  return 0;
}
Example #2
0
File: elch.cpp Project: Bardo91/pcl
int
main (int argc, char **argv)
{
  pcl::registration::ELCH<PointType> elch;
  pcl::IterativeClosestPoint<PointType, PointType>::Ptr icp (new pcl::IterativeClosestPoint<PointType, PointType>);
  icp->setMaximumIterations (100);
  icp->setMaxCorrespondenceDistance (0.1);
  icp->setRANSACOutlierRejectionThreshold (0.1);
  elch.setReg (icp);

  CloudVector clouds;
  for (int i = 1; i < argc; i++)
  {
    CloudPtr pc (new Cloud);
    pcl::io::loadPCDFile (argv[i], *pc);
    clouds.push_back (CloudPair (argv[i], pc));
    std::cout << "loading file: " << argv[i] << " size: " << pc->size () << std::endl;
    elch.addPointCloud (clouds[i-1].second);
  }

  int first = 0, last = 0;

  for (size_t i = 0; i < clouds.size (); i++)
  {

    if (loopDetection (int (i), clouds, 3.0, first, last))
    {
      std::cout << "Loop between " << first << " (" << clouds[first].first << ") and " << last << " (" << clouds[last].first << ")" << std::endl;
      elch.setLoopStart (first);
      elch.setLoopEnd (last);
      elch.compute ();
    }
  }

  for (size_t i = 0; i < clouds.size (); i++)
  {
    std::string result_filename (clouds[i].first);
    result_filename = result_filename.substr (result_filename.rfind ("/") + 1);
    pcl::io::savePCDFileBinary (result_filename.c_str (), *(clouds[i].second));
    std::cout << "saving result to " << result_filename << std::endl;
  }

  return 0;
}
int main (int argc, char **argv)
{
  std::vector<int> pcd_indices;
  pcd_indices = pcl::console::parse_file_extension_argument (argc, argv, ".pcd");
  pcl::PointCloud<pcl::PointXYZRGB>::Ptr sum_clouds (new pcl::PointCloud<pcl::PointXYZRGB>);

  CloudVector clouds;
  for (size_t i = 0; i < pcd_indices.size (); i++)
  {
    CloudPtr pc (new Cloud);
    pcl::io::loadPCDFile (argv[pcd_indices[i]], *pc);
    std::cout << "loading file: " << argv[pcd_indices[i]] << " size: " << pc->size () << std::endl;
    *sum_clouds += *pc;
  }
  std::string result_filename ("merged");
  result_filename += getTimeAsString();
  result_filename += ".pcd";
  pcl::io::savePCDFileASCII (result_filename.c_str (), *sum_clouds);
  std::cout << "saving result to " << result_filename << std::endl;

  return 0;
}
Example #4
0
File: icp.cpp Project: KoenBuys/pcl
int
main (int argc, char **argv)
{
  double dist = 0.05;
  pcl::console::parse_argument (argc, argv, "-d", dist);

  double rans = 0.05;
  pcl::console::parse_argument (argc, argv, "-r", rans);

  int iter = 50;
  pcl::console::parse_argument (argc, argv, "-i", iter);

  bool nonLinear = false;
  pcl::console::parse_argument (argc, argv, "-n", nonLinear);

  std::vector<int> pcd_indices;
  pcd_indices = pcl::console::parse_file_extension_argument (argc, argv, ".pcd");

  CloudPtr model (new Cloud);
  if (pcl::io::loadPCDFile (argv[pcd_indices[0]], *model) == -1)
  {
    std::cout << "Could not read file" << std::endl;
    return -1;
  }
  std::cout << argv[pcd_indices[0]] << " width: " << model->width << " height: " << model->height << std::endl;

  std::string result_filename (argv[pcd_indices[0]]);
  result_filename = result_filename.substr (result_filename.rfind ("/") + 1);
  pcl::io::savePCDFile (result_filename.c_str (), *model);
  std::cout << "saving first model to " << result_filename << std::endl;

  Eigen::Matrix4f t (Eigen::Matrix4f::Identity ());

  for (size_t i = 1; i < pcd_indices.size (); i++)
  {
    CloudPtr data (new Cloud);
    if (pcl::io::loadPCDFile (argv[pcd_indices[i]], *data) == -1)
    {
      std::cout << "Could not read file" << std::endl;
      return -1;
    }
    std::cout << argv[pcd_indices[i]] << " width: " << data->width << " height: " << data->height << std::endl;

    pcl::IterativeClosestPoint<PointType, PointType> *icp;

    if (nonLinear)
    {
      std::cout << "Using IterativeClosestPointNonLinear" << std::endl;
      icp = new pcl::IterativeClosestPointNonLinear<PointType, PointType>();
    }
    else
    {
      std::cout << "Using IterativeClosestPoint" << std::endl;
      icp = new pcl::IterativeClosestPoint<PointType, PointType>();
    }

    icp->setMaximumIterations (iter);
    icp->setMaxCorrespondenceDistance (dist);
    icp->setRANSACOutlierRejectionThreshold (rans);

    icp->setInputTarget (model);

    icp->setInputSource (data);

    CloudPtr tmp (new Cloud);
    icp->align (*tmp);

    t = icp->getFinalTransformation () * t;

    pcl::transformPointCloud (*data, *tmp, t);

    std::cout << icp->getFinalTransformation () << std::endl;

    *model = *data;

    std::string result_filename (argv[pcd_indices[i]]);
    result_filename = result_filename.substr (result_filename.rfind ("/") + 1);
    pcl::io::savePCDFileBinary (result_filename.c_str (), *tmp);
    std::cout << "saving result to " << result_filename << std::endl;
  }

  return 0;
}
Example #5
0
File: lum.cpp Project: 2php/pcl
int
main (int argc, char **argv)
{
  double dist = 2.5;
  pcl::console::parse_argument (argc, argv, "-d", dist);

  int iter = 10;
  pcl::console::parse_argument (argc, argv, "-i", iter);

  int lumIter = 1;
  pcl::console::parse_argument (argc, argv, "-l", lumIter);

  double loopDist = 5.0;
  pcl::console::parse_argument (argc, argv, "-D", loopDist);

  int loopCount = 20;
  pcl::console::parse_argument (argc, argv, "-c", loopCount);

  pcl::registration::LUM<PointType> lum;
  lum.setMaxIterations (lumIter);
  lum.setConvergenceThreshold (0.001f);

  std::vector<int> pcd_indices;
  pcd_indices = pcl::console::parse_file_extension_argument (argc, argv, ".pcd");

  CloudVector clouds;
  for (size_t i = 0; i < pcd_indices.size (); i++)
  {
    CloudPtr pc (new Cloud);
    pcl::io::loadPCDFile (argv[pcd_indices[i]], *pc);
    clouds.push_back (CloudPair (argv[pcd_indices[i]], pc));
    std::cout << "loading file: " << argv[pcd_indices[i]] << " size: " << pc->size () << std::endl;
    lum.addPointCloud (clouds[i].second);
  }

  for (int i = 0; i < iter; i++)
  {
    for (size_t i = 1; i < clouds.size (); i++)
      for (size_t j = 0; j < i; j++)
      {
        Eigen::Vector4f ci, cj;
        pcl::compute3DCentroid (*(clouds[i].second), ci);
        pcl::compute3DCentroid (*(clouds[j].second), cj);
        Eigen::Vector4f diff = ci - cj;

        //std::cout << i << " " << j << " " << diff.norm () << std::endl;

        if(diff.norm () < loopDist && (i - j == 1 || i - j > loopCount))
        {
          if(i - j > loopCount)
            std::cout << "add connection between " << i << " (" << clouds[i].first << ") and " << j << " (" << clouds[j].first << ")" << std::endl;
          pcl::registration::CorrespondenceEstimation<PointType, PointType> ce;
          ce.setInputTarget (clouds[i].second);
          ce.setInputSource (clouds[j].second);
          pcl::CorrespondencesPtr corr (new pcl::Correspondences);
          ce.determineCorrespondences (*corr, dist);
          if (corr->size () > 2)
            lum.setCorrespondences (j, i, corr);
        }
      }

    lum.compute ();

    for(size_t i = 0; i < lum.getNumVertices (); i++)
    {
      //std::cout << i << ": " << lum.getTransformation (i) (0, 3) << " " << lum.getTransformation (i) (1, 3) << " " << lum.getTransformation (i) (2, 3) << std::endl;
      clouds[i].second = lum.getTransformedCloud (i);
    }
  }

  for(size_t i = 0; i < lum.getNumVertices (); i++)
  {
    std::string result_filename (clouds[i].first);
    result_filename = result_filename.substr (result_filename.rfind ("/") + 1);
    pcl::io::savePCDFileBinary (result_filename.c_str (), *(clouds[i].second));
    //std::cout << "saving result to " << result_filename << std::endl;
  }

  return 0;
}
Example #6
0
int
main (int argc, char **argv)
{

  int iter = 35;
  pcl::console::parse_argument (argc, argv, "-i", iter);

  float ndt_res = 1.0f;
  pcl::console::parse_argument (argc, argv, "-r", ndt_res);

  double step_size = 0.1;
  pcl::console::parse_argument (argc, argv, "-s", step_size);

  double trans_eps = 0.01;
  pcl::console::parse_argument (argc, argv, "-t", trans_eps);

  float filter_res = 0.2f;
  pcl::console::parse_argument (argc, argv, "-f", filter_res);

  bool display_help = false;
  pcl::console::parse_argument (argc, argv, "--help", display_help);

  if (display_help || argc <= 1)
  {
    std::cout << "Usage: ndt3d [OPTION]... [FILE]..." << std::endl;
    std::cout << "Registers PCD files using 3D Normal Distributions Transform algorithm" << std::endl << std::endl;
    std::cout << "  -i          maximum number of iterations" << std::endl;
    std::cout << "  -r          resolution (in meters) of NDT grid" << std::endl;
    std::cout << "  -s          maximum step size (in meters) of newton optimizer" << std::endl;
    std::cout << "  -t          transformation epsilon used for termination condition" << std::endl;
    std::cout << "  -f          voxel filter resolution (in meters) used on source cloud" << std::endl;
    std::cout << "     --help   display this help and exit" << std::endl;

    return (0);
  }

  std::vector<int> pcd_indices;
  pcd_indices = pcl::console::parse_file_extension_argument (argc, argv, ".pcd");

  CloudPtr model (new Cloud);
  if (pcl::io::loadPCDFile (argv[pcd_indices[0]], *model) == -1)
  {
    std::cout << "Could not read file" << std::endl;
    return -1;
  }
  std::cout << argv[pcd_indices[0]] << " width: " << model->width << " height: " << model->height << std::endl;

  std::string result_filename (argv[pcd_indices[0]]);
  result_filename = result_filename.substr (result_filename.rfind ("/") + 1);
  pcl::io::savePCDFile (result_filename.c_str (), *model);
  std::cout << "saving first model to " << result_filename << std::endl;

  Eigen::Matrix4f t (Eigen::Matrix4f::Identity ());

  pcl::ApproximateVoxelGrid<PointType> voxel_filter;
  voxel_filter.setLeafSize (filter_res, filter_res, filter_res);

  for (size_t i = 1; i < pcd_indices.size (); i++)
  {
    CloudPtr data (new Cloud);
    if (pcl::io::loadPCDFile (argv[pcd_indices[i]], *data) == -1)
    {
      std::cout << "Could not read file" << std::endl;
      return -1;
    }
    std::cout << argv[pcd_indices[i]] << " width: " << data->width << " height: " << data->height << std::endl;

    pcl::NormalDistributionsTransform<PointType, PointType> * ndt = new pcl::NormalDistributionsTransform<PointType, PointType>();

    ndt->setMaximumIterations (iter);
    ndt->setResolution (ndt_res);
    ndt->setStepSize (step_size);
    ndt->setTransformationEpsilon (trans_eps);

    ndt->setInputTarget (model);

    CloudPtr filtered_data (new Cloud);
    voxel_filter.setInputCloud (data);
    voxel_filter.filter (*filtered_data);

    ndt->setInputSource (filtered_data);

    CloudPtr tmp (new Cloud);
    ndt->align (*tmp);

    t = ndt->getFinalTransformation () * t;

    pcl::transformPointCloud (*data, *tmp, t);

    std::cout << ndt->getFinalTransformation () << std::endl;

    *model = *data;

    std::string result_filename (argv[pcd_indices[i]]);
    result_filename = result_filename.substr (result_filename.rfind ("/") + 1);
    pcl::io::savePCDFileBinary (result_filename.c_str (), *tmp);
    std::cout << "saving result to " << result_filename << std::endl;
  }

  return (0);
}
Example #7
0
File: ndt2d.cpp Project: cgrad/pcl
int
main (int argc, char **argv)
{
    int iter = 10;
    double grid_step = 3.0;
    double grid_extent = 25.0;
    double optim_step = 1.0;

    pcl::console::parse_argument (argc, argv, "-i", iter);
    pcl::console::parse_argument (argc, argv, "-g", grid_step);
    pcl::console::parse_argument (argc, argv, "-e", grid_extent);
    pcl::console::parse_argument (argc, argv, "-s", optim_step);

    std::vector<int> pcd_indices;
    pcd_indices = pcl::console::parse_file_extension_argument (argc, argv, ".pcd");

    CloudPtr model (new Cloud);
    if (pcl::io::loadPCDFile (argv[pcd_indices[0]], *model) == -1)
    {
        std::cout << "Could not read file" << std::endl;
        return -1;
    }
    std::cout << argv[pcd_indices[0]] << " width: " << model->width << " height: " << model->height << std::endl;

    std::string result_filename (argv[pcd_indices[0]]);
    result_filename = result_filename.substr (result_filename.rfind ("/") + 1);
    try
    {
        pcl::io::savePCDFile (result_filename.c_str (), *model);
        std::cout << "saving first model to " << result_filename << std::endl;
    }
    catch(pcl::IOException& e)
    {
        std::cerr << e.what() << std::endl;
    }

    Eigen::Matrix4f t (Eigen::Matrix4f::Identity ());

    for (size_t i = 1; i < pcd_indices.size (); i++)
    {
        CloudPtr data (new Cloud);
        if (pcl::io::loadPCDFile (argv[pcd_indices[i]], *data) == -1)
        {
            std::cout << "Could not read file" << std::endl;
            return -1;
        }
        std::cout << argv[pcd_indices[i]] << " width: " << data->width << " height: " << data->height << std::endl;

        //pcl::console::setVerbosityLevel(pcl::console::L_DEBUG);

        pcl::NormalDistributionsTransform2D<PointType, PointType> ndt;

        ndt.setMaximumIterations (iter);
        ndt.setGridCentre (Eigen::Vector2f (15,0));
        ndt.setGridExtent (Eigen::Vector2f (grid_extent,grid_extent));
        ndt.setGridStep (Eigen::Vector2f (grid_step,grid_step));
        ndt.setOptimizationStepSize (optim_step);
        ndt.setTransformationEpsilon (1e-5);

        ndt.setInputTarget (model);
        ndt.setInputCloud (data);

        CloudPtr tmp (new Cloud);
        ndt.align (*tmp);

        t = ndt.getFinalTransformation () * t;

        pcl::transformPointCloud (*data, *tmp, t);

        std::cout << ndt.getFinalTransformation () << std::endl;

        *model = *data;

        try
        {
            std::string result_filename (argv[pcd_indices[i]]);
            result_filename = result_filename.substr (result_filename.rfind ("/") + 1);
            pcl::io::savePCDFileBinary (result_filename.c_str (), *tmp);
            std::cout << "saving result to " << result_filename << std::endl;
        }
        catch(pcl::IOException& e)
        {
            std::cerr << e.what() << std::endl;
        }
    }

    return 0;
}
Example #8
0
int
main (int argc, char **argv)
{
  double dist = 0.05;
  pcl::console::parse_argument (argc, argv, "-d", dist);

  double rans = 0.05;
  pcl::console::parse_argument (argc, argv, "-r", rans);

  int iter = 50;
  pcl::console::parse_argument (argc, argv, "-i", iter);

  std::vector<int> pcd_indices;
  pcd_indices = pcl::console::parse_file_extension_argument (argc, argv, ".pcd");

  CloudPtr model (new Cloud);
  if (pcl::io::loadPCDFile (argv[pcd_indices[0]], *model) == -1)
  {
    std::cout << "Could not read file" << std::endl;
    return -1;
  }
  std::cout << argv[pcd_indices[0]] << " width: " << model->width << " height: " << model->height << std::endl;

  std::string result_filename (argv[pcd_indices[0]]);
  result_filename = result_filename.substr (result_filename.rfind ("/") + 1);
  pcl::io::savePCDFile (result_filename.c_str (), *model);
  std::cout << "saving first model to " << result_filename << std::endl;

  Eigen::Matrix4f t (Eigen::Matrix4f::Identity ());

  for (size_t i = 1; i < pcd_indices.size (); i++)
  {
    CloudPtr data (new Cloud);
    if (pcl::io::loadPCDFile (argv[pcd_indices[i]], *data) == -1)
    {
      std::cout << "Could not read file" << std::endl;
      return -1;
    }
    std::cout << argv[pcd_indices[i]] << " width: " << data->width << " height: " << data->height << std::endl;

    pcl::IterativeClosestPointNonLinear<PointType, PointType> icp;

    boost::shared_ptr<pcl::registration::WarpPointRigid3D<PointType, PointType> > warp_fcn 
      (new pcl::registration::WarpPointRigid3D<PointType, PointType>);

    // Create a TransformationEstimationLM object, and set the warp to it
    boost::shared_ptr<pcl::registration::TransformationEstimationLM<PointType, PointType> > te (new pcl::registration::TransformationEstimationLM<PointType, PointType>);
    te->setWarpFunction (warp_fcn);

    // Pass the TransformationEstimation objec to the ICP algorithm
    icp.setTransformationEstimation (te);

    icp.setMaximumIterations (iter);
    icp.setMaxCorrespondenceDistance (dist);
    icp.setRANSACOutlierRejectionThreshold (rans);

    icp.setInputTarget (model);

    icp.setInputCloud (data);

    CloudPtr tmp (new Cloud);
    icp.align (*tmp);

    t = icp.getFinalTransformation () * t;

    pcl::transformPointCloud (*data, *tmp, t);

    std::cout << icp.getFinalTransformation () << std::endl;

    *model = *data;

    std::string result_filename (argv[pcd_indices[i]]);
    result_filename = result_filename.substr (result_filename.rfind ("/") + 1);
    pcl::io::savePCDFileBinary (result_filename.c_str (), *tmp);
    std::cout << "saving result to " << result_filename << std::endl;
  }

  return 0;
}