一、内容介绍
本节主要介绍OpenCV的imgproc模块的角点检测(Feature Detection)部分:
1、Harris角点函数 cornerHarris()
2、Threshold函数
定义:“如果某一点在任意方向的一个微小变动都会引起灰度很大的变化,那么我们就把它称之为角点”
二、Harris角点基本原理
1、推导:
椭圆的扁率和尺寸是由M(x,y)的特征值λ1、λ2决定的,椭贺的方向是由M(x,y)的特征矢量决定的。
椭圆函数特征值与图像中的角点、直线(边缘)和平面之间的关系如下图所示。共可分为三种情况:
- 图像中的直线。一个特征值大,另一个特征值小,λ1≫λ2λ1≫λ2或λ2≫λ1λ2≫λ1。自相关函数值在某一方向上大,在其他方向上小。
- 图像中的平面。两个特征值都小,且近似相等;自相关函数数值在各个方向上都小。
- 图像中的角点。两个特征值都大,且近似相等,自相关函数在所有方向都增大。
衡量标准
在3×33×3或5×55×5的邻域内进行非最大值抑制,局部最大值点即为图像中的角点。
非极大值抑制原理:在一个窗口内,如果有多个角点则用值最大的那个角点,其他的角点都删除,窗口大小这里我们用3*3,程序中通过图像的膨胀运算来达到检测极大值的目的,因为默认参数的膨胀运算就是用窗口内的最大值替代当前的灰度值。
2、特性:
旋转不变性
Harris角点检测算子使用的是角点附近的区域灰度二阶矩矩阵。而二阶矩矩阵可以表示成一个椭圆,椭圆的长短轴正是二阶矩矩阵特征值平方根的倒数。当特征椭圆转动时,特征值并不发生变化,所以判断角点响应值RR也不发生变化,由此说明Harris角点检测算子具有旋转不变性。
不具有尺度不变性
三、OpenCV接口
1、cornerHarris
void cornerHarris(InputArray src,OutputArray dst, int blockSize, int ksize, double k, intborderType=BORDER_DEFAULT )
- src – 输入的单通道8-bit或浮点图像。
- dst – 存储着Harris角点响应的图像矩阵,大小与输入图像大小相同,是一个浮点型矩阵。
- blockSize – 邻域大小。
- apertureSize – 扩展的微分算子大。
- k – 响应公式中的,参数αα。
- boderType – 边界处理的类型。
2、Threshold函数
double threshold(InputArray src,OutputArray dst, double thresh, double maxval, int type)
该函数的典型应用是对灰度图像进行阈值操作得到二值图像。
- src – 输入的单通道8-bit或浮点图像。
- dst – 存储着Harris角点响应的图像矩阵,大小与输入图像大小相同,是一个浮点型矩阵。
- thresh,阈值的具体值。
- maxval,当第五个参数阈值类型type取 CV_THRESH_BINARY 或CV_THRESH_BINARY_INV 阈值类型时的最大值.
- type,阈值类型,。threshold( )函数支持的对图像取阈值的方法由其确定,具体用法如下图:
综合实例
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat gray = imread("house.png",0);
imshow("原图", gray);
//Harris角点检测
Mat cornerStrength;
cornerHarris(gray, cornerStrength, 2, 3, 0.01);
Mat harrisCorner;
threshold(cornerStrength, harrisCorner, 0.00001, 255, THRESH_BINARY);
imshow("效果图", harrisCorner);
waitKey(0);
return 0;
}