08的最小二乘法向量使用的一些问题

lming_08

你好 !

我在引用你的基于最小二乘法估计点云的曲面法向量这篇文章的成果时遇到的一些问题,如果你能看到,麻烦不吝赐教。

1、使用_METHOD1_计算和最小二乘法的结果是完全一致的。

2、使用_METHOD2_,,问题如下

我稍稍更改了平面法向量代码(其次坐标系)直接应用来求点的平面方程,在使用过程中遇到离散点不在一个平面是拟合出来的平面方程和最小二乘法拟合的结果方程差异和大(你所给的实例中的点云拟合的平面却又和最小二乘法拟合的平面方程一致),请问我直接使用是否可以,不可以的话问题是出在哪里呢?

我使用点云拟合平面的代码

void computePointNormal (const pcl::PointCloud<pcl::PointXYZ> &cloud, float &nx, float &ny, float &nz,float &nd){#define _METHOD2_#ifdef _METHOD2_Eigen::MatrixX4f mat_ext(cloud.size(), 4);for (size_t i = 0, ind_num = cloud.size(); i < ind_num; ++i){mat_ext(i, 0) = cloud.points[i].x;mat_ext(i, 1) = cloud.points[i].y;mat_ext(i, 2) = cloud.points[i].z;mat_ext(i, 3) = 1;}Eigen::MatrixXf mat_mult_ext = mat_ext.transpose() * mat_ext; //mat是3*k_矩阵,mat_ext是k_*4矩阵// A*x = b, A.Row(0).cross(A.Row(1)) = eigenvector(0);Eigen::Vector4f row_vec[3];row_vec[0] = mat_mult_ext.row(0);row_vec[1] = mat_mult_ext.row(1);row_vec[2] = mat_mult_ext.row(2);Eigen::Matrix3f i_cofactor, j_cofactor, k_cofactor, l_cofactor; //计算叉积时,i、j、k、l分量的代数余子式for (size_t row_index = 0; row_index < 3; ++row_index){for (size_t col_index = 0; col_index < 3; ++col_index){i_cofactor(row_index , col_index) = row_vec[row_index][col_index + 1];if (col_index < 1){j_cofactor(row_index , col_index) = row_vec[row_index][col_index];}else{j_cofactor(row_index , col_index) = row_vec[row_index][col_index + 1];}if (col_index < 2){k_cofactor(row_index , col_index) = row_vec[row_index][col_index];}else{k_cofactor(row_index , col_index) = row_vec[row_index][col_index + 1];}l_cofactor(row_index , col_index) = row_vec[row_index][col_index];}}float i_dim = 0, j_dim = 0, k_dim = 0, l_dim = 0;i_dim = i_cofactor.determinant();j_dim = j_cofactor.determinant();k_dim = k_cofactor.determinant();l_dim = l_cofactor.determinant();Eigen::Vector4f coeff_vec(i_dim, -j_dim, k_dim, -l_dim);// Eigen::Vector4f argument = mat_mult_ext.colPivHouseholderQr().solve(b);// Eigen::Vector4f coeff_vec11(argument[0], argument[1], argument[2],argument[3]);coeff_vec.squaredNorm();// Eigen::Vector3f coeff_vec(i_dim, -j_dim, k_dim);// float len = coeff_vec.squaredNorm();// //coeff_vec /= len; coeff_vec /= k_dim;nx = coeff_vec[0];ny = coeff_vec[1];nz = coeff_vec[2];nd = coeff_vec[3];#endif}我所使用测试的点云

xyzP1000.01P2010.2P302-0.2P4100.25P511-0.3P612-0.1P7200.2P821-0.2P9220.15

最小二乘法拟合的方程z = 0.079 + 0.023x + -0.102y你的程序拟合的方程z=1.645+0.563x+0.689y麻烦不吝赐教! 谢谢

如果你愿意解答我的困惑可留言或是联系我 dearpeer@126.com719594159

你并不一定会从此拥有更美好的人生,

08的最小二乘法向量使用的一些问题

相关文章:

你感兴趣的文章:

标签云: