c++手写计算关键点BRIEF描述子向量
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);
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;
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);
else val.push_back(0);
}
descriptor.push_back(val);
}
}