예제 #1
0
int main(int argc, char** argv) 
{
    std::string seg_path("data/ln_joint/");
    std::string gt_path("final_joint_gt/");
    std::string out_path("");
    
    //pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer());
    //viewer->initCameraParameters();
    //viewer->addCoordinateSystem(0.1);
    //viewer->setCameraPosition(0, 0, 0.1, 0, 0, 1, 0, -1, 0);
    
    int c1 = 0, c2 = -1;
    pcl::console::parse_argument(argc, argv, "--gt", gt_path);
    pcl::console::parse_argument(argc, argv, "--eg", seg_path);
    pcl::console::parse_argument(argc, argv, "--o", out_path);
    
    pcl::console::parse_argument(argc, argv, "--c1", c1);
    pcl::console::parse_argument(argc, argv, "--c2", c2);
    
    if( out_path.empty() == false && exists_dir(out_path) == false )
        boost::filesystem::create_directories(out_path);
    
    float acc = 0;
    int acc_count = 0;
    for(int i = c1 ; i <= c2 ; i++ )
    {
        std::stringstream ss;
        ss << i;
        
        std::string pcd_file(seg_path + "seg_" + ss.str() + ".pcd");
        std::string link_pose_file(gt_path + "link_gt_" + ss.str() + ".csv");
        std::string node_pose_file(gt_path + "node_gt_" + ss.str() + ".csv");
        std::cerr << "Loading... " << pcd_file << std::endl;
        
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>());
        pcl::io::loadPCDFile(pcd_file, *cloud);
        if( cloud->empty() == true )
            break;
        acc_count++;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        std::vector<poseT> all_poses;
        readCSV(link_pose_file, "link", all_poses);
        readCSV(node_pose_file, "node", all_poses);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //read meshes
        ModelT link_mesh = LoadMesh(link_mesh_name, "link");
        ModelT node_mesh = LoadMesh(node_mesh_name, "node"); 
        
        std::vector<ModelT> mesh_set;
        mesh_set.push_back(link_mesh);
        mesh_set.push_back(node_mesh);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        
        //viewer->removePointCloud("cloud");
        //viewer->addPointCloud(cloud, "cloud");
        //viewer->spin();
        
        float cur_acc = segAcc(mesh_set, all_poses, cloud);
        std::cerr << "P: " << cur_acc << std::endl;
        acc += cur_acc;
        
        if( out_path.empty() == false )
            pcl::io::savePCDFile(out_path + "seg_" + ss.str() + ".pcd", *cloud, true);
        
        //viewer->removePointCloud("cloud");
        //viewer->addPointCloud(cloud, "cloud");
        //viewer->spin();
        /*
        cv::Mat gt_label, seg_label, uv;
        int gt_num = MeshOn2D(mesh_set, all_poses, gt_label);
        int seg_num = segProj(cloud, seg_label, uv);
        int true_pos = overlapGT(gt_label, seg_label, uv);
        
        std::cerr << "P: " << (true_pos+0.0) / seg_num << std::endl;
        acc += (true_pos+0.0) / seg_num;
        //*
        showLabel(gt_label, "GT");
        showLabel(seg_label, "Seg");
        //*/
    }
    std::cerr << "Seg-Acc: " << acc / acc_count << std::endl;
    
/*************************************************************************************************************************/

    return 0;
}
예제 #2
0
int main(int argc, char** argv)
{

  std::string database_path,result_path;

  database_path = "PCA.txt";
  result_path = "result";

  double pi =  4 * atan(1);

  double distance_limit = 0.001, angle_limit = pi * 0.25;

  /* Note that if the model is read from a file the scale should be 1.0, otherwise if the model is calculated from a database the scale should be around 0.1 */

  double scale = 1.0;

  double energy_weight = 0.001;

  int device = CV_CAP_OPENNI;

  Registration registrator;

  /* Path to the database of the model */

  pcl::console::parse_argument (argc, argv, "-database", database_path);

  /* Path to the file where the final result is saved */

  pcl::console::parse_argument (argc, argv, "-result", result_path);

  /* The distance threshold for establishing the correspondences */

  pcl::console::parse_argument (argc, argv, "-distance", distance_limit);

  /* The angle threshold between the normals for establishing the correspondences */

  pcl::console::parse_argument (argc, argv, "-angle", angle_limit);

  /* The scale to which the training set has to be brought to */

  pcl::console::parse_argument (argc, argv, "-scale", scale);

  /* The weight that the regularizing part of the Non-Rigid Registration should have */

  pcl::console::parse_argument (argc, argv, "-energy_weight", energy_weight);


  Eigen::Matrix3d transform_matrix = Eigen::Matrix3d::Identity();
  Eigen::Vector3d translation = Eigen::Vector3d::Zero();

  transform_matrix(0,0) = scale;
  transform_matrix(1,1) = scale;
  transform_matrix(2,2) = scale;

  /* For some reason, the cloud returned by the Asus Xtion is always up-side down, so the model is rotated by 180 degrees along the Ox axis */

  transform_matrix = Eigen::AngleAxisd(pi,Eigen::Vector3d::UnitX()) * transform_matrix;


  /* This switch enables the debug mode in order to analyze in the PCLVisualizer the intermiediate steps of the registration */

  bool debug = pcl::console::find_switch (argc, argv, "-debug");

  if( pcl::console::find_switch (argc, argv, "-Asus") )
  {
    device = CV_CAP_OPENNI_ASUS;
  }

  registrator.setDebugMode ( debug );

  /* In this if branch the target cloud is a simple snapshot from the Kinect/Xtion */

  if(pcl::console::find_switch (argc, argv, "--camera"))
  {

    std::string xml_file("haarcascade_frontalface_alt.xml");

    pcl::console::parse_argument (argc, argv, "-xml_file", xml_file);

    registrator.getTargetPointCloudFromCamera(device,xml_file);
    registrator.getDataForModel(database_path, transform_matrix, translation, scale);
    registrator.alignModel();
    registrator.calculateAlternativeRegistrations(50,energy_weight,15,100,angle_limit,distance_limit,debug);

  }

  /* In this if branch the target cloud is read from a pcd file */

  if(pcl::console::find_switch (argc, argv, "--scan"))
  {

    std::string pcd_file("target.pcd");

    pcl::console::parse_argument (argc, argv, "-target", pcd_file);


    float x,y,z;

    pcl::console::parse_argument (argc, argv, "-x", x);
    pcl::console::parse_argument (argc, argv, "-y", y);
    pcl::console::parse_argument (argc, argv, "-z", z);

    pcl::PointXYZ face(x,y,z);

    registrator.getTargetPointCloudFromFile(pcd_file, face);
    registrator.getDataForModel(database_path, transform_matrix, translation, scale);
    registrator.alignModel();
    registrator.calculateAlternativeRegistrations(50,energy_weight,15,100,angle_limit,distance_limit,debug);

  }

  /* In this if branch the target cloud is read by using the KinfuTracker */


  if(pcl::console::find_switch (argc, argv, "--kinfu"))
  {

    registrator.getDataForModel (database_path, transform_matrix, translation, scale);
    registrator.calculateKinfuTrackerRegistrations (device,50,energy_weight,100,angle_limit,distance_limit);
  }


  registrator.writeDataToPCD(result_path);



  return (0);
}