ORB特征是在fast特征点的基础上再加上一个旋转量,本文以opencv自带的fast函数求出特征点keypoint,取特征点附近一小块区域B,B的大小是16*16,范围是(u-8,v-8),(u+7,v+7),可以定义该区域图像的矩:
通过矩可以找到图像的质心
连接图像中心O与质心,可以得到方向向量OC,于是特征点的方向可以定义为
这里有几点需要特别注意:
1,访问像素
image.at<uchar>(v+i,u+j)
<>里为uchar,而不是char,一个是无符号数,一个是有符号数。
然后y对应的是行,x对应的是列
void computeAngle(const cv::Mat &image, vector<cv::KeyPoint> &keypoints) {
int half_patch_size = 8;
for (auto &kp : keypoints) { //每一个keypoint对应一个小图像块,有一个角度
// START YOUR CODE HERE (~7 lines)
kp.angle=0;
int u=0;
int v=0;
double I;
double m01=0;
double m10=0;
u=(int)kp.pt.x;
v=(int)kp.pt.y;
if(u>=half_patch_size&&v>=half_patch_size&&u<(image.rows-half_patch_size+1)&&v<(image.cols-half_patch_size+1))
{
for(int i=-8;i<=7;i++)
for(int j=-8;j<=7;j++)
{
I=image.at<uchar>(v+i,u+j);
m01+=j*I;
m10+=i*I;
}
}
kp.angle=(float)(atan2(m10,m01)/pi*180);
cout<<"pos:"<<kp.pt.x<<" "<<kp.pt.y<<"angle:"<<kp.angle<<endl;
}
// END YOUR CODE HERE
return;
}