PCL 学习 计算点云法向量的夹角

一、数学推导

PCL 计算点云法向量的夹角_点云侠的博客-CSDN博客

二、代码实现

1、pcl 中计算夹角的函数

double   pcl::getAngle3D (const Vector4f &v1, const Vector4f &v2, const bool in_degree=false)

// 第一个法向量
// 第二个法向量
// false 表示的输出结果是弧度 true 表示的是角度值

源码:

//
 inline double
 pcl::getAngle3D (const Eigen::Vector4f &v1, const Eigen::Vector4f &v2, const bool in_degree)
 {
   // Compute the actual angle
   double rad = v1.normalized ().dot (v2.normalized ());
   if (rad < -1.0)
     rad = -1.0;
   else if (rad >  1.0)
     rad = 1.0;
   return (in_degree ? std::acos (rad) * 180.0 / M_PI : std::acos (rad));
 }
  
 inline double
 pcl::getAngle3D (const Eigen::Vector3f &v1, const Eigen::Vector3f &v2, const bool in_degree)
 {
   // Compute the actual angle
   double rad = v1.normalized ().dot (v2.normalized ());
   if (rad < -1.0)
     rad = -1.0;
   else if (rad >  1.0)
     rad = 1.0;
   return (in_degree ? std::acos (rad) * 180.0 / M_PI : std::acos (rad));
 }
  

三、测试

#if 1    三维计算两个向量之间的夹角
using namespace  Eigen;
int main()
{
    Vector3f  v1(1, 1, 0), v2(1, 1, 1);
    //false 表示的输出结果是弧度 true 表示的是角度值
    double  angle_pcl=pcl::getAngle3D(v1,v2,false); 
    double angle = atan2(v1.cross(v2).norm(), v1.transpose() * v2); // 


    cout << "自己写的代码计算结果:" << angle << endl;
    cout << "调用库函数实现的结果:" << angle_pcl << endl;


    return  0;
}

#endif

你可能感兴趣的:(PCL,pcl)