c++计算关键点BRIEF描述子

c++手写计算关键点BRIEF描述子向量

/**
 * @author 还下着雨ZG
 * @brief 用于当前图像计算关键点的BRIEF描述子
 * @param[in] img 图像,传入的应该为灰度图像,便于减少计算量
 * @param[in] kps vector<cv::KeyPoint>类型,存放了img的关键点
 * @param[in] pattern 匹配模式
 * @param[out] descriptor 输出的描述子结果
*/
void get_descriptor(const cv::Mat &img,const std::vector<cv::KeyPoint>&kps,
                    std::vector<std::vector<bool> > &descriptor,int * pattern){
  Eigen::Vector2f u1_v1_rotated,u2_v2_rotated;
  const float PI=3.1415926;
  float u1=0.,v1=0.,u2=0.,v2=0.;
  float cos_angle=0,sin_angle=0;
  Eigen::Matrix2f M_angle;
  float angle;
  const float rad=(PI/180);
  int t1=0,t2=0;//用于存放关键点周围需要比较大小的两个像素值
  const int step=img.step;//图像每一行包含多少个像素
  for(auto kp:kps){//遍历关键点
    const uchar *center=&img.at<uchar>(kp.pt.y,kp.pt.x);//指向图像img中的关键点
    angle=kp.angle;
    std::vector<bool> val;
    cos_angle=cos((PI/180)*angle);sin_angle=sin((PI/180)*angle);
    M_angle<<cos_angle,-sin_angle,
              sin_angle, cos_angle;//旋转矩阵,用于对pattern的坐标进行变换
    for(int i=0;i<256*4;i+=4){
      u1=pattern[i];v1=pattern[i+1];
      u2=pattern[i+2];v2=pattern[i+3];
      u1_v1_rotated=M_angle*Eigen::Vector2f(u1,v1);
      u2_v2_rotated=M_angle*Eigen::Vector2f(u2,v2);//对该坐标进行变换
      t1=center[int(u1_v1_rotated[1]*step)+int(u1_v1_rotated[0])];
      t2=center[int(u2_v2_rotated[1]*step)+int(u1_v1_rotated[0])];//取变换之后图像的像素值
      if(t1<t2) val.push_back(1);//当前描述子向量的一个分量为1
      else val.push_back(0);//当前描述子向量的一个分量为0
    }
    descriptor.push_back(val);//存储当前关键点的描述子向量(128维)
  }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值