opencv中提供了Harris角点检测的接口,即cv::cornerHarris()
缺陷:角点是像素级别的,速度较慢
dst = cv2.cornerHarris(gray,2,3,0.04)
img - 数据类型为 float32 的输入图像
blockSize - 角点检测中要考虑的领域大小
ksize - Sobel 求导中使用的窗口大小
k - Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06]
cv::goodFeaturesToTrack()的具体调用形式如下:
void cv::goodFeaturesToTrack(
cv::InputArray image, // 输入图像(CV_8UC1 CV_32FC1)
cv::OutputArray corners, // 输出角点vector
int maxCorners, // 最大角点数目
double qualityLevel, // 质量水平系数(小于1.0的正数,一般在0.01-0.1之间)
double minDistance, // 最小距离,小于此距离的点忽略
cv::InputArray mask = noArray(), // mask=0的点忽略
int blockSize = 3, // 使用的邻域数
bool useHarrisDetector = false, // false ='Shi Tomasi metric'
double k = 0.04 // Harris角点检测时使用
);
Harris角点检测
cvGoodFeaturesToTrack(img_gray,eig_img,temp_img,corners,&corner_count,quality_level,min_distance)
shi-Tomas角点检测
goodFeaturesToTrack(src_gray,corners,maxCorners,qualityLevel,minDistance,Mat(),blockSize,useHarrisDetector,k);
效果比goodFeaturesToTrack()要好
void cv::cornerSubPix(
cv::InputArray image, // 输入图像
cv::InputOutputArray corners, // 角点(既作为输入也作为输出)
cv::Size winSize, // 区域大小为 NXN; N=(winSize*2+1)
cv::Size zeroZone, // 类似于winSize,但是总具有较小的范围,Size(-1,-1)表示忽略
cv::TermCriteria criteria // 停止优化的标准
);
Speeded Up Robust Feature
尺度不变特征,而且是具有较高计算效率的特征
SurfFeatureDetector surfDetector(800); // 海塞矩阵阈值,在这里调整精度,值越大点越少,越精准
vector keyPoint1, keyPoint2;
surfDetector.detect(image1, keyPoint1);
surfDetector.detect(image2, keyPoint2);
ScaleInvariant Feature Transform
SIFT算法检测的特征在空间和尺度上定位更加精确
尺度不变特征,在注重速度的场合难有应用
SiftFeatureDetector siftDetector(2000); // 海塞矩阵阈值,在这里调整精度,值越大点越少,越精准
vector keyPoint1, keyPoint2;
siftDetector.detect(image1, keyPoint1);
siftDetector.detect(image2, keyPoint2);
Oriented FAST and Rotated BRIEF
旋转不变性,没有尺度不变性
ORB::ORB(int nfeatures=500, float scaleFactor=1.2f, int nlevels=8, int edgeThreshold=31, int firstLevel=0, int WTA_K=2,
int scoreType=ORB::HARRIS_SCORE, int patchSize=31)
nfeatures - 最多提取的特征点的数量;
scaleFactor - 金字塔图像之间的尺度参数,类似于SIFT中的k;
nlevels – 高斯金字塔的层数;
edgeThreshold – 边缘阈值,这个值主要是根据后面的patchSize来定的,靠近边缘edgeThreshold以内的像素是不检测特征点的。
firstLevel - 看过SIFT都知道,我们可以指定第一层的索引值,这里默认为0。
WET_K - 用于产生BIREF描述子的 点对的个数,一般为2个,也可以设置为3个或4个,那么这时候描述子之间的距离计算就不能用汉明距离了,而是应该用一个变种。OpenCV中,如果设置WET_K = 2,则选用点对就只有2个点,匹配的时候距离参数选择NORM_HAMMING,如果WET_K设置为3或4,则BIREF描述子会选择3个或4个点,那么后面匹配的时候应该选择的距离参数为NORM_HAMMING2。
scoreType - 用于对特征点进行排序的算法,你可以选择HARRIS_SCORE,也可以选择FAST_SCORE,但是它也只是比前者快一点点而已。
patchSize – 用于计算BIREF描述子的特征点邻域大小。
ORB orb;
orb.detect(img_1, keypoints_1);
orb.detect(img_2, keypoints_2);