C++ OpenCV特征提取之Harris角点检测

简介

算法基本思想是使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。

关于角点的应用在图像处理上比较广泛,如图像匹配(FPM特征点匹配)、相机标定等。网上也有很多博客对Harris角点检测原理进行描述,但基本上只是描述了算法流程,而其中相关细节并未作出解释,我们简单补充说明一下

角点

下面有两幅不同视角的图像,通过找出对应的角点进行匹配。


再看下图所示,放大图像的两处角点区域:


我们可以直观的概括下角点所具有的特征:

>轮廓之间的交点;

>对于同一场景,即使视角发生变化,通常具备稳定性质的特征;

>该点附近区域的像素点无论在梯度方向上还是其梯度幅值上有着较大变化;

算法基本思想是使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点

先上效果视频


相关API

cornerHarris(InputArray src, OutputArray dst, int blockSize, int apertureSize, double k, int borderType=BORDER_DEFAULT )

参数:

  • src – 输入单通道8位或浮点图像.

  • dst – 图像存储Harris检测器响应。它具有CVY32 FC1类型,大小与SRC相同

  • blockSize – 邻域大小

  • apertureSize – 索贝尔算子参数值

  • k – Harris检测器的阈值

  • boderType – 参数

实现步骤

  1. 将图像转为灰度图(cvtcolor)

  2. 创建一个CV_32FC1的同样大小图像(Mat::zeros(size,CV_32FC1))

  3. 进行Harris角点检测(cornerHarris)

  4. 归一化(normalize)

  5. 转化为绝对值(convertScaleAbs)

  6. 把获取到的的大于阈值的的角点画红色的圆显示出来

代码演示

我们新建一个项目opencv--connerharris,简单说一下,以后我们就不再说了,我们把Opencv3.4.1重新用Cmake编译了一遍,因为做特片简单需要加入Opencv-contrib的库,所以我们重新编译在newbuild里了,同时编译环境也重新配了一个,配置里面多少一些DLL和LIB别的还是按照配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法

在上面定义一个默认阈值和一个过程方法,因为我们用到了Trackbar

然输出图像上创建Trackbar

在过程前先转为灰度图

接下来就是重点,我们的Harris_Deal的方法

显示效果


-END-

长按下方二维码关注微卡智享

                                                     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值