Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 #include <gtest/gtest.h>
00039 #include <pcl/io/pcd_io.h>
00040 #include <pcl/registration/correspondence_estimation_normal_shooting.h>
00041 #include <pcl/features/normal_3d.h>
00042 #include <pcl/kdtree/kdtree.h>
00043 
00045 TEST (CorrespondenceEstimation, CorrespondenceEstimationNormalShooting)
00046 {
00047   pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1 (new pcl::PointCloud<pcl::PointXYZ> ());
00048   pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2 (new pcl::PointCloud<pcl::PointXYZ> ());
00049 
00050   
00051   for (float i = 0.0f; i < 10.0f; i += 0.2f)
00052   {
00053     for (float z = 0.0f; z < 5.0f; z += 0.2f)
00054     {
00055       cloud1->points.push_back (pcl::PointXYZ (i, 0, z));
00056       cloud2->points.push_back (pcl::PointXYZ (i, 2, z)); 
00057     }
00058   }
00059         
00060   pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
00061   ne.setInputCloud (cloud1); 
00062 
00063   pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
00064   ne.setSearchMethod (tree);
00065 
00066   pcl::PointCloud<pcl::Normal>::Ptr cloud1_normals (new pcl::PointCloud<pcl::Normal>);
00067   ne.setKSearch (5);
00068   ne.compute (*cloud1_normals); 
00069 
00070   pcl::CorrespondencesPtr corr (new pcl::Correspondences);
00071   pcl::registration::CorrespondenceEstimationNormalShooting <pcl::PointXYZ, pcl::PointXYZ, pcl::Normal> ce;
00072   ce.setInputSource (cloud1);
00073   ce.setKSearch (10);
00074   ce.setSourceNormals (cloud1_normals);
00075   ce.setInputTarget (cloud2);
00076   ce.determineCorrespondences (*corr);
00077 
00078   
00079   for (unsigned int i = 0; i < corr->size (); i++)
00080   {
00081     EXPECT_EQ ((*corr)[i].index_query, (*corr)[i].index_match);
00082   }
00083 }
00084 
00086 TEST (CorrespondenceEstimation, CorrespondenceEstimationSetSearchMethod)
00087 {
00088   
00089   pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1 (new pcl::PointCloud<pcl::PointXYZ> ());
00090   pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2 (new pcl::PointCloud<pcl::PointXYZ> ());
00091   for ( size_t i = 0; i < 50; i++ )
00092   {
00093     cloud1->points.push_back(pcl::PointXYZ(float (rand()), float (rand()), float (rand())));
00094     cloud2->points.push_back(pcl::PointXYZ(float (rand()), float (rand()), float (rand())));
00095   }
00096   
00097   pcl::search::KdTree<pcl::PointXYZ>::Ptr tree1 (new pcl::search::KdTree<pcl::PointXYZ> ());
00098   tree1->setInputCloud (cloud1);
00099   pcl::search::KdTree<pcl::PointXYZ>::Ptr tree2 (new pcl::search::KdTree<pcl::PointXYZ> ());
00100   tree2->setInputCloud (cloud2);
00101   
00102   pcl::registration::CorrespondenceEstimation<pcl::PointXYZ, pcl::PointXYZ, double> ce;
00103   ce.setInputSource (cloud1);
00104   ce.setInputTarget (cloud2);
00105   pcl::Correspondences corr_orig;
00106   ce.determineCorrespondences(corr_orig);
00107   
00108   ce.setSearchMethodSource (tree1, true);
00109   ce.setSearchMethodTarget (tree2, true);
00110   pcl::Correspondences corr_cached;
00111   ce.determineCorrespondences (corr_cached);
00112   
00113   EXPECT_EQ(corr_orig.size(), corr_cached.size());
00114   for(size_t i = 0; i < corr_orig.size(); i++)
00115   {
00116     EXPECT_EQ(corr_orig[i].index_query, corr_cached[i].index_query);
00117     EXPECT_EQ(corr_orig[i].index_match, corr_cached[i].index_match);
00118   }
00119   
00120 }
00121 
00122 
00123 int
00124   main (int argc, char** argv)
00125 {
00126   testing::InitGoogleTest (&argc, argv);
00127   return (RUN_ALL_TESTS ());
00128 }
00129