voxel.cpp
Go to the documentation of this file.
00001 /*************************************************************************
00002   > File Name: voxel.cpp
00003   > Author: 吴乃亮
00004   > Mail: wunailiang@gmail.com
00005   > Created Time: Wed 21 May 2014 09:35:49 AM CST
00006  ************************************************************************/
00007 #include "voxel.h"
00008 using namespace std;
00009 
00010 void Voxelize::generateUmap(pcl::PointCloud<pcl::PointXYZ> &cloud,double resolution,boost::unordered_map<unordered_map_voxel,un_key> &m)//遍历每个点,生成栅格。然后计算每个栅格的参数
00011 {
00012     un_key tempp;  //key键不允许修改,全存在value中
00013 
00014     for(int i=0;i<cloud.size();i++)
00015     {
00016         unordered_map_voxel tempv(cloud[i].x,cloud[i].y,cloud[i].z,resolution);
00017 
00018         pair<umap::iterator,bool> pair_insert = m.insert(umap::value_type(tempv,tempp));//这个pair就是用来存储插入返回值的,看是否这个栅格已经存在
00019 
00020         pair_insert.first->second.vec_index_point.push_back(i);
00021     }
00022 
00023     Matrix3d tempmat;
00024     tempmat.setZero();
00025 
00026     pcl::PointXYZ temppoint(0,0,0);
00027     for(umap::iterator iter=m.begin();iter!=m.end();)
00028     {
00029         temppoint.x=temppoint.y=temppoint.z=0;
00030         if(iter->second.vec_index_point.size()<10)
00031         {
00032             m.erase(iter++);
00033             continue;
00034         }
00035 
00036         for(int j = 0;j<iter->second.vec_index_point.size();j++)
00037         {
00038             double x_ = cloud[iter->second.vec_index_point[j]].x;
00039             double y_ = cloud[iter->second.vec_index_point[j]].y;
00040             double z_ = cloud[iter->second.vec_index_point[j]].z;
00041 
00042             tempmat += (Vector3d(x_,y_,z_) * RowVector3d(x_,y_,z_));//存储pipiT的和
00043             temppoint.x += x_;
00044             temppoint.y += y_;
00045             temppoint.z += z_;
00046         }
00047 
00048         int n = iter->second.vec_index_point.size();
00049 
00050         Vector3d v(temppoint.x/n,temppoint.y/n,temppoint.z/n);//存储栅格重心
00051         RowVector3d vT(temppoint.x/n,temppoint.y/n,temppoint.z/n);
00052 
00053         tempmat /= n;
00054         tempmat -= v*vT;//S
00055         iter->second.matS = tempmat;
00056 
00057         vector<eigen_sort> vector1(3);//用于排序
00058 
00059         EigenSolver<MatrixXd> es(tempmat);
00060         VectorXcd eivals = es.eigenvalues();
00061         MatrixXcd eigenvectors = es.eigenvectors();
00062 
00063         vector1[0]=eigen_sort(eivals(0).real(),es.eigenvectors().col(0));
00064         vector1[1]=eigen_sort(eivals(1).real(),es.eigenvectors().col(1));
00065         vector1[2]=eigen_sort(eivals(2).real(),es.eigenvectors().col(2));
00066         sort(vector1.begin(),vector1.end());
00067 
00068         double lamada1 = vector1[0].eigen_value;
00069         double lamada2 = vector1[1].eigen_value;
00070         double lamada3 = vector1[2].eigen_value;
00071         //
00072         if(vector1[0].eigen_vector(2).real()<0)
00073         {
00074             vector1[0].eigen_vector(2).real() = -vector1[0].eigen_vector(2).real();
00075         }
00076         if(vector1[2].eigen_vector(2).real()<0)
00077         {
00078             vector1[2].eigen_vector(2).real() = -vector1[2].eigen_vector(2).real();
00079         }
00080 
00081         iter->second.c = (lamada3-lamada2)/(lamada1+lamada2+lamada3);
00082         iter->second.p = 2*(lamada2-lamada1)/(lamada1+lamada2+lamada3);
00083         iter->second.u = v;
00084         iter->second.v1 = vector1[0].eigen_vector;
00085         iter->second.v3 = vector1[2].eigen_vector;
00086 
00087         double c = iter->second.c;
00088         double p = iter->second.p;
00089 
00090 
00091         iter->second.vector_9D << v(0),v(1),v(2),p*vector1[0].eigen_vector(0).real(),p*vector1[0].eigen_vector(1).real(),
00092             p*vector1[0].eigen_vector(2).real(),c*vector1[2].eigen_vector(0).real(),c*vector1[2].eigen_vector(1).real(),
00093             p*vector1[2].eigen_vector(2).real();
00094 
00095         tempmat.setZero();
00096 
00097         iter++;
00098     }
00099 }
00100 
00101 pair<umap::iterator,bool> Voxelize::neighbor_search( umap &m, umap &m1,const unordered_map_voxel &tempp )//搜索最近邻
00102 {
00103     int x_b,x_t,y_b,y_t,z_b,z_t;
00104     double o_dis = 10000.0; //存储临近栅格之间,9D向量的欧式距离
00105 
00106     umap::iterator vox_iter = m1.find(tempp);
00107     if(vox_iter == m.end())
00108     {
00109         pair<umap::iterator,bool> return_value(m.end(),false);
00110         cout << "出错"<<endl;
00111         return return_value;
00112     }
00113 
00114     if(tempp.x() == 1 || tempp.x()==2)
00115     {
00116         x_b = tempp.x() -3;
00117         x_t = tempp.x() +2;
00118     }
00119     else if(tempp.x()== -1 || tempp.x()== -2)
00120     {
00121         x_b = tempp.x() -2;
00122         x_t = tempp.x() +3;
00123     }
00124     else
00125     {
00126         x_b = tempp.x() -2;
00127         x_t = tempp.x() +2;
00128     }
00129 
00130     //对y处理
00131     if(tempp.y() == 1 || tempp.y()==2)
00132     {
00133         y_b = tempp.y() -3;
00134         y_t = tempp.y() +2;
00135     }
00136     else if(tempp.y()== -1 || tempp.y()== -2)
00137     {
00138         y_b = tempp.y() -2;
00139         y_t = tempp.y() +3;
00140     }
00141     else
00142     {
00143         y_b = tempp.y() -2;
00144         y_t = tempp.y() +2;
00145     }
00146 
00147     //对Z处理
00148     if(tempp.z() == 1 || tempp.z()==2)
00149     {
00150         z_b = tempp.z() -3;
00151         z_t = tempp.z() +2;
00152     }
00153     else if(tempp.z()== -1 || tempp.z()== -2)
00154     {
00155         z_b = tempp.z() -2;
00156         z_t = tempp.z() +3;
00157     }
00158     else
00159     {
00160         z_b = tempp.z() -2;
00161         z_t = tempp.z() +2;
00162     }
00163 
00164     int x_min,y_min,z_min; //距离最近栅格的坐标
00165 
00166     for(int i = x_b; i<= x_t ; i++)
00167     {
00168         for(int j = y_b; j <= y_t ; j++)
00169         {
00170             for(int k = z_b ; k <= z_t ; k++)
00171             {
00172                 unordered_map_voxel temp_vox(i,j,k);
00173                 if(m.count(temp_vox)>0 )
00174                 {
00175                     if(m.find(temp_vox)->second.cout ==0)
00176                         continue;
00177 
00178                     ArrayXd o_distance = m.find(temp_vox)->second.vector_9D- vox_iter->second.vector_9D;
00179                     double o_dis_temp = o_distance.square().sum();
00180                     if(o_dis_temp < o_dis)
00181                     {
00182                         o_dis = o_dis_temp;
00183                         x_min = i;
00184                         y_min = j;
00185                         z_min = k;
00186                     }
00187                 }
00188             }
00189         }
00190     }
00191 
00192     if(o_dis>= 0.5 )
00193     {
00194         pair<umap::iterator,bool> return_value(m.find(unordered_map_voxel(x_min,y_min,z_min)),false);
00195         return return_value;
00196     }
00197     //cout <<"原始栅格坐标为:"<<tempp.x()<<" "<<tempp.y()<<" "<<tempp.z()<<endl;
00198     //cout <<"最近的欧式距离为:"<<o_dis<<"属于:"<<x_min<<" "<<y_min <<" "<< z_min<<endl;
00199     pair<umap::iterator,bool> return_value(m.find(unordered_map_voxel(x_min,y_min,z_min)),true);
00200     return return_value;
00201 }
00202 
00203 


dlut_hash_icp
Author(s): Zhuang Yan , Yan Fei, Wu Nai Liang
autogenerated on Thu Jun 6 2019 18:56:21