OpenCV特征提取与检测(一)

1 Harris角点检测

1.1 绪论

角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界。角点检测(Corner Detection)是计算机视觉系统中获取图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维重建和目标识别等,也可称为特征点检测。
它们在图像中可以轻易定位,同时它们在人造物体中场景中,如门窗,桌子等中随处可见。因为角点位于两条边缘的交点处,代表了两个边缘变化的方向上的点,所以它们是可以精确定位的二维特征,甚至可以达到亚像素的精度。且其图像梯度有很高的变化,这种变化是可以用来帮助检测角点的。需要注意的是,角点与位于相同强度区域上的点不同,与物体轮廓上的点也不同,因为轮廓点难以在相同的其他物体上精确定位。

1.2 角点的定义

如果某一点在任意方向的一个微小变动都会引起灰度很大的变化,那么我们就把它称之为角点。
关于角点的具体描述可以有几种:
1、一阶导数(即灰度的梯度)的局部最大所对应的像素点
2、两条及两条以上边缘的点
3、图像中的梯度值和梯度方向的变化速率都很高的点
4、角点处的一阶导数最大,二阶导数为0,指示物体边缘变化不连续的方向

1.3 Harris角点检测原理

1)Harris角点检测是在任意方向上移动(u,v),都会有很明显的变化。如下图一个局部很小的区域,如果是在图片区域中移动灰度值没有变化,那么窗口内不存在角点。如果在某一个方向上移动,一个发生很大变化而另一侧没有变化,那么说明这个区域是位于该对象的边缘区域。
在这里插入图片描述
2)数学模型
根据上述的算法思想,可以构建数学模型,图像窗口平移[u,v]产生灰度变化E(u,v)为:
在这里插入图片描述
其含义是对于图像I(x,y),在点(x,y)处平移(u,v)后的自相似性。其中w(x,y)是加权函数,它可以是常数,也可以是高斯加权函数。如图2所示。
在这里插入图片描述
根据泰勒展开和一些数学步骤后可得到如下结果:
在这里插入图片描述
λ1和λ2是M的特征值。这些特征值决定了一个区域是角点,边缘还是平坦区域。
当|R|很小时,即λ1和λ2很小时,该区域时平坦区域。
当 R < 0时,即λ1远远大于λ2或者λ2远远大于λ1时,该区域时边缘。
当 R很大时,即λ1和λ2都很大且近似相等,该区域时角点。
他们的关系可以表示为下图:
在这里插入图片描述

1.4 相应的API

Harris角点检测:
1)该算法算子对亮度和对比度的变化不敏感。
2)算子具有旋转不变性。
3)算子不具有尺度不变性。
在OpenCV中,已经提供了Harris角点检测函数cornerHarris():

void cv::cornerHarris(InputArray src, OutputArray dst,int blockSize, int ksize, double k, int borderType)

参数说明:
src: 输入8bit 单通道灰度Mat矩阵;
dst:用于保存Harris角点检测结果,32位单通道,大小与src相同;
blockSize:滑块窗口的尺寸;
ksize:Sobel边缘检测滤波器大小;
k:Harries中间参数,经验值0.04~0.06;
borderType=BORDER_DEFAULT:插值类型。
综合示例:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;
Mat src, gray_src;
int thresh = 130;
int max_count = 255;
const char* output_title = "HarrisCornerDetection Result";
void Harris_Demo(int, void*);
int main(int argc, char** argv) {
   

	src = imread("D:/vcprojects/images/home.jpg");
	if (src.empty()) {
   
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);

	namedWindow(output_title, CV_WINDOW_AUTOSIZE);
	cvtColor(src, gray_src, COLOR_BGR2GRAY);
	createTrackbar("Threshold:", output_title, &thresh, max_count, Harris_Demo);
	Harris_Demo(0, 0
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值