00001
00002
00003
00004
00005
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;
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));
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_));
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;
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;
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
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
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
00198
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