pcl源码分析之Harris关键点(二)


前言

前文已经总结了一下pcl源码提取Harris关键点的流程和大致原理,这篇文章对关键函数进行详细分析,点云3DHarris角点检测算法推导,可以参考文章1,以及文章2,结合起来看,才能成为自己的东西~~

一、responseHarris响应函数

1.responseHarris函数

template <typename PointInT, typename PointOutT, typename NormalT> void
pcl::HarrisKeypoint3D<PointInT, PointOutT, NormalT>::responseHarris (PointCloudOut &output) const
{
   
  PCL_ALIGN (16) float covar [8]; 
  output.resize (input_->size ());
#pragma omp parallel for \ //for循环多线程,这个之前讲过,不再赘述
  default(none) \
  shared(output) \
  firstprivate(covar) \
  num_threads(threads_)
  for (int pIdx = 0; pIdx < static_cast<int> (input_->size ()); ++pIdx)
  {
   
    const PointInT& pointIn = input_->points [pIdx];
    output [pIdx].intensity = 0.0; //std::numeric_limits<float>::quiet_NaN ();
    if (isFinite (pointIn))
    {
   
      pcl::Indices nn_indices;
      std::vector<float> nn_dists;
      tree_->radiusSearch (pointIn, search_radius_, nn_indices, nn_dists);//查找该点近邻区域
      calculateNormalCovar (nn_indices, covar);//利用近邻区域的法向量构造协方差矩阵

      float trace = covar [0] + covar [5] + covar [7];//A矩阵的迹
      if (trace != 0)
      {
   
        //A矩阵的行列式
        float det = covar [0] * covar [5] * covar [7] + 2.0f * covar [1] * covar [2] * covar [6]
                  - covar [2] * covar [2] * covar [5]
                  - covar [1] * covar [1] * covar [7]
                  - covar [6] * covar [6] * covar [0];
		//响应函数,从公式看直接就是:det - 0.04f * trace * trace,这里多加了一个k(0.04)
        output [pIdx].intensity = 0.04f + det - 0.04f * trace * trace;
      }
    }
    //坐标不变
    output [pIdx].x = pointIn.x;
    output [pIdx].y = pointIn.y;
    output [pIdx].z = pointIn.z
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值