35 #include <Eigen/Dense>
41 #include <gsl/gsl_math.h>
42 #include <gsl/gsl_eigen.h>
50 using Vec = BaseVector<float>;
63 vector<float> normals;
68 size_t n_inPoints = in_buffer->numPoints();
69 floatArr in_points = in_buffer->getPointArray();
70 ucharArr in_colors = in_buffer->getColorArray(w_color);
73 floatArr p_arr(
new float[n_inPoints * 3]);
74 floatArr n_arr(
new float[n_inPoints * 3]);
76 if(in_buffer->hasColors())
78 c_arr =
ucharArr(
new unsigned char[n_inPoints * 3]);
107 for(
size_t i = 0; i < mat.
pixels.size(); i++)
109 #pragma omp parallel for
110 for(
size_t j = 0; j < mat.
pixels[i].size(); j++)
113 if(mat.
pixels[i][j].size() == 0)
119 vector<ModelToImage::PanoramaPoint> nb;
122 std::copy(mat.
pixels[i][j].begin(), mat.
pixels[i][j].end(), std::back_inserter(nb));
124 for(
int off_i = -di; off_i <= di; off_i++)
126 for(
int off_j = -dj; off_j <= dj; off_j++)
132 if(p_i >= 0 && p_i < mat.
pixels.size() &&
133 p_j >= 0 && p_j < mat.
pixels[i].size())
139 if(mat.
pixels[p_i][p_j].size() > 0)
141 nb.push_back(mat.
pixels[p_i][p_j][0]);
154 for(
int i = 0; i < nb.size(); i++)
157 size_t index = nb[i].index * 3;
160 Vec neighbor(in_points[index],
161 in_points[index + 1],
162 in_points[index + 2]);
165 mean.
x += neighbor.
x;
166 mean.
y += neighbor.
y;
167 mean.
z += neighbor.
z;
174 double covariance[9] = {0};
176 for(
int i = 0; i < nb.size(); i++)
178 size_t index = nb[i].index * 3;
180 Vec pt(in_points[index ] - mean.
x,
181 in_points[index + 1] - mean.
y,
182 in_points[index + 3] - mean.
z);
184 covariance[4] += pt.
y * pt.
y;
185 covariance[7] += pt.
y * pt.
z;
186 covariance[8] += pt.
z * pt.
z;
192 covariance[0] += pt.
x;
193 covariance[1] += pt.
y;
194 covariance[6] += pt.
z;
198 covariance[3] = covariance[1];
199 covariance[2] = covariance[6];
200 covariance[5] = covariance[7];
202 for(
int i = 0; i < 9; i++)
204 covariance[i] /= nb.size();
208 gsl_matrix_view m = gsl_matrix_view_array(covariance, 3, 3);
209 gsl_matrix* evec = gsl_matrix_alloc(3, 3);
210 gsl_vector* eval = gsl_vector_alloc(3);
213 gsl_eigen_symmv_workspace * w = gsl_eigen_symmv_alloc (3);
214 gsl_eigen_symmv (&m.matrix, eval, evec, w);
216 gsl_eigen_symmv_free (w);
217 gsl_eigen_symmv_sort (eval, evec, GSL_EIGEN_SORT_ABS_ASC);
219 gsl_vector_view evec_0 = gsl_matrix_column(evec, 0);
220 float nx = gsl_vector_get(&evec_0.vector, 0);
221 float ny = gsl_vector_get(&evec_0.vector, 1);
222 float nz = gsl_vector_get(&evec_0.vector, 2);
228 size_t index = mat.
pixels[i][j][0].index * 3;
229 Vec p1 = center -
Vec(in_points[index], in_points[index + 1], in_points[index + 2]);
238 for(
size_t k = 0; k < mat.
pixels[i][j].size(); k++)
243 size_t index = mat.
pixels[i][j][k].index * 3;
244 size_t color_index = mat.
pixels[i][j][k].index * w_color;
247 p_arr[index ] = in_points[index];
248 p_arr[index + 1] = in_points[index + 1];
249 p_arr[index + 2] = in_points[index + 2];
251 if(in_buffer->hasColors())
253 c_arr[index ] = in_colors[color_index];
254 c_arr[index + 1] = in_colors[color_index + 1];
255 c_arr[index + 2] = in_colors[color_index + 2];
261 n_arr[index + 1] = ny;
262 n_arr[index + 2] = nz;
320 cout <<
timestamp <<
"Finished normal estimation" << endl;
322 if(in_buffer->hasColors())
324 out_buffer->setColorArray(c_arr, n_inPoints);
326 out_buffer->setPointArray(p_arr, n_inPoints);
327 out_buffer->setNormalArray(n_arr, n_inPoints);