一、检测图像中的角点
1、定义
角点是指两条边缘线的结合点,是一种二维特征,Harris特征检测是检测角点的经典方法。
2、函数实现
在OpenCV中用cv::cornerHarris函数实现角点检测。首先用cornerHarris函数计算出Harris值,,然后检测角点。
3、总结一下最近遇到的函数
①void minMaxLoc(const MatND& src, double* minVal, double* maxVal, int* minIdx=0, int* maxIdx=0, const MatND& mask=MatND() )寻找矩阵(一维数组当作向量,用Mat定义) 中最小值和最大值的位置
参数1:InputArray类型的src,输入单通道数组(图像)。
参数2:double*类型的minVal,返回最小值的指针。若无须返回,此值置为NULL。
参数3:double*类型的maxVal,返回最大值的指针。若无须返回,此值置为NULL。
参数4:Point*类型的minLoc,返回最小位置的指针(二维情况下)。若无须返回,此值置为NULL。
参数5:Point*类型的maxLoc,返回最大位置的指针(二维情况下)。若无须返回,此值置为NULL。
参数6:InputArray类型的mask,用于选择子阵列的可选掩膜。
②cv::compare()主要用于两个图像之间进行逐像素的比较,并输出比较的结果
cv::compare()
bool cv::compare(
cv::InputArray src1, // 输入数组1
cv::InputArray src2, // 输入数组2
cv::OutputArray dst, // 输出数组
int cmpop // 比较操作子,见下表
);
4、角点定义
在Harris特征检测中,角点的定义:在假定的兴趣点周围放置一个小窗口,在所有方向上计算平均强度变化值,若不止一个方向变化值很高,就认为是角点,用均方差之和表示。Harris测试步骤为:首先获得平均强度值变化最大的方向,然后检测垂直方向上平均强度变化值,若也是很大,则认为是角点,可以用泰勒展开近似计算,写成矩阵形式是一个协方差矩阵,定义了图像的一阶导数,因此和Soble算子有关系。判断一个角点的条件是协方差矩阵最小特征值要大于指定的阈值。
5、改进
为解决特征点聚集问题,使用了GFTT算法,限制两个监测点之间的距离。GFTT是一个检测器,使用检测器创建函数创建检测器,该函数会返回一个智能指针,然后用这个指针调用检测方法。
二、快速检测特征
FAST特征点算子(加速分割测试获得特征)
1、原理
它也是一个检测器,使用了智能指针。以某个点为圆心做圆,若存在一段圆弧,连续长度超过周长的3/4,并且它上面的像素值与圆心的强度值明显不同,就认定为一个关键点。可以只检测上下左右四个点来判断是否为关键点,也有九点检测类型。
2、绘图的通用函数
drawKeypoints,在图像上绘制关键点。
3、若特征点分布不均匀,可以将图像分割成网格状,对每个小图像进行单独检测,叫做网格适配特征检测。
三、尺度不变特征的检测
在多种尺度下拍摄同一个物体,都可以检测到一致的关键点。
1、SURF特征检测,加速稳健特征。它也是一个检测器,该检测器得到的关键点的圆,圆的尺寸与每个特征检测得到的尺寸成正比,并每个特征关联了一个方向,使特征具有旋转不变性。使用了高斯内核
2、SUFR算法是SIFT(尺度不变特征转换)算法的加速版。使用了拉普拉斯滤波器响应。
3、Hessian矩阵(海森矩阵)
用来衡量一个函数的局部曲率。
四、多尺度FAST特征的检测(涉及到图像金字塔)
1、BRISK(二元稳健恒定可扩展关键点)检测法
基于FAST特征检测。
2、ORB检测法(定向FAST和旋转BRIEF)