harris角点检测
- 格式:docx
- 大小:662.94 KB
- 文档页数:8
角点检测的原理角点检测是一种计算机视觉领域中常用的图像处理技术,它的原理是通过对图像中的角点进行检测和提取,从而分析和识别图像中的特定目标或结构。
角点是图像中具有显著变化的位置,它们通常位于物体的边缘、交叉处或纹理变化明显的区域。
在角点检测中,我们希望找到这些具有显著变化的点,因为它们对于图像的特征描述和目标识别非常重要。
角点检测的原理是基于图像中的灰度变化或梯度变化来判断某个点是否为角点。
常用的角点检测算法有Harris角点检测、Shi-Tomasi 角点检测等。
Harris角点检测算法是由Chris Harris和Mike Stephens于1988年提出的,它通过计算图像中每个像素点的灰度梯度来确定其是否为角点。
该算法首先计算每个像素点的梯度值,然后根据梯度的变化情况来判断该点是否为角点。
如果一个点的梯度变化比较大,说明该点可能是角点。
Shi-Tomasi角点检测算法是在Harris角点检测算法的基础上进行改进的。
它引入了一个新的评价指标,即最小特征值,来代替Harris算法中的响应函数。
该算法通过计算每个像素点的最小特征值来判断其是否为角点。
最小特征值越大,说明该点越可能是角点。
除了Harris角点检测和Shi-Tomasi角点检测,还有一些其他的角点检测算法,如FAST角点检测、SIFT角点检测等。
这些算法在原理和实现方式上有所不同,但都是基于图像中的灰度变化或梯度变化来检测角点。
角点检测在计算机视觉和图像处理中有着广泛的应用。
它可以用于目标识别、图像匹配、图像拼接等领域。
通过检测和提取图像中的角点,我们可以得到图像的特征描述,从而实现对图像的分析、识别和处理。
总结起来,角点检测是一种通过对图像中的角点进行检测和提取的图像处理技术。
它的原理是基于图像中的灰度变化或梯度变化来判断某个点是否为角点。
角点检测在计算机视觉和图像处理中有着广泛的应用,可以用于目标识别、图像匹配、图像拼接等领域。
3dharris原理3D哈里斯原理是一种用于目标检测和图像处理的方法。
它以人类的视角进行写作,使文章富有情感,并使读者感到仿佛是真人在叙述。
尽量保证文章的自然度以及流畅度,避免文章让人感觉像机器生成。
在目标检测和图像处理领域,3D哈里斯原理是一种常用的技术。
它基于哈里斯角点检测算法,通过分析图像中的像素点的灰度值和其周围像素点的灰度值的差异来判断该点是否为角点。
通过对图像中的角点进行检测和提取,可以实现目标的定位和识别。
3D哈里斯原理的核心思想是利用图像中的像素点的灰度变化来找到角点。
在图像处理过程中,我们常常需要对图像进行角点检测,以便进行图像配准、目标跟踪、物体测量等操作。
3D哈里斯原理通过计算每个像素点的灰度值和其周围像素点的灰度值之间的差异来判断该点是否为角点。
如果某个像素点的灰度值与周围像素点的灰度值相差较大,则说明该点可能是角点。
在实际应用中,我们可以将3D哈里斯原理应用于三维模型的检测和处理中。
通过对三维模型进行角点检测,可以快速准确地提取出模型的特征点,从而实现对模型的定位和识别。
例如,在三维重建领域,我们可以利用3D哈里斯原理来提取出三维点云中的角点,从而实现对三维模型的建立和重建。
除了在目标检测和图像处理领域,3D哈里斯原理还可以应用于其他领域,例如机器人导航、虚拟现实等。
在机器人导航中,我们可以利用3D哈里斯原理来检测出环境中的角点,从而实现机器人的定位和导航。
在虚拟现实中,我们可以利用3D哈里斯原理来提取出虚拟场景中的角点,从而实现虚拟场景的渲染和显示。
3D哈里斯原理是一种常用的目标检测和图像处理方法。
它以人类的视角进行写作,使文章富有情感,并使读者感到仿佛是真人在叙述。
通过对图像中的像素点的灰度值和其周围像素点的灰度值的差异进行分析,可以实现对目标的定位和识别。
同时,3D哈里斯原理还可以应用于其他领域,如机器人导航和虚拟现实。
通过对3D哈里斯原理的研究和应用,我们可以更好地理解和掌握目标检测和图像处理的技术,为实际应用提供更多的可能性。
角点检测轮廓曲线检测原理
角点是图像中像素值发生较大变化的位置,通常表示图像中物体的边界或区域的交汇点。
角点检测的原理是在图像中找到像素值变化较大的位置,并计算出角点的强度。
常用的角点检测算法包括Harris角点检测和SIFT角点检测。
Harris角点检测通过计算图像的梯度来确定角点的位置,通过计算灰度协方差矩阵来计算角点响应函数,高响应值的位置即为角点。
SIFT 角点检测通过计算图像的高斯差分金字塔来定位角点。
轮廓曲线检测:
轮廓曲线是图像中物体与背景之间的边界线。
轮廓曲线检测的原理是在图像中找到像素值变化较大的位置,并将这些像素点连接起来形成连续的边界线。
常用的轮廓曲线检测算法包括Canny边缘检测和Sobel边缘检测。
Canny边缘检测通过计算图像的梯度和梯度的方向来确定边缘的位置,并通过滞后阈值和非极大值抑制来提高边缘检测的准确性。
Sobel边缘检测通过计算图像的水平和垂直梯度来确定边缘的位置,并通过阈值来提取边缘。
matlab中的detectharrisfeaturesMatlab中的detectHarrisFeatures函数是一个用于检测Harris角点的特征点的函数。
在本文中,我们将一步一步回答与这个函数相关的问题,并详细讨论其工作原理和用法,包括输入参数、输出参数以及一些示例代码。
Harris角点检测方法是由Chris Harris和Mike Stephens在1988年提出的,它是一种用于在图像中检测兴趣点的算法。
这个算法主要用于计算图像局部区域的强度变化,以及这些变化的方向,并根据这些信息确定特征点。
首先,让我们了解一下detectHarrisFeatures函数的基本用法和语法。
在Matlab中,您可以使用以下语法调用这个函数:points = detectHarrisFeatures(img)这个函数采用一个图像作为输入,并返回一个包含检测到的Harris角点的一个对象数组。
可以使用这个点数组进行进一步的处理和分析。
在这里,'img'是要进行Harris角点检测的输入图像。
这可以是一个灰度图像或一个彩色图像。
函数将自动将彩色图像转换为灰度图像进行处理。
现在,让我们深入了解detectHarrisFeatures函数的工作原理和各个参数的作用。
Harris角点检测方法是通过对图像进行局部窗口内的像素灰度值计算来实现的。
通过在每个像素位置使用一个小的窗口,该方法计算出一个称为Harris矩阵的矩阵。
Harris矩阵包含了图像局部区域中的灰度值变化情况。
根据Harris矩阵的特征值,可以确定图像中的角点。
Harris矩阵的计算基于以下公式:H = [A B; B C]其中A、B和C是通过计算图像灰度值在局部窗口内的x和y方向上的梯度的平方和的积分。
detectHarrisFeatures函数具有几个参数,这些参数可以根据需要进行设置。
以下是这些参数的详细说明:1. 'FilterSize'参数:这个参数用来指定局部窗口的大小。
Harris 角点检测算法编程步骤及示例演示也不说那么多废话了,要介绍啥背景意义之类的,角点检测,顾名思义,就是检测角点,最简单的就是两条线的交点了,还有比如下国际象棋的棋盘格子的交点之类的,反正就是检测这些点。
简单将Harris 角点检测算法的思想说下,就是拿一个小窗在图像中移动,通过考察这个小窗口内图像灰度的平均变换值来确定角点。
1)如果窗口内区域图像的灰度值恒定,那么所有不同方向的偏移几乎不发生变化;2)如果窗口跨越一条边,那么沿着这条边的偏移几乎不发生变化,但是与边垂直的偏移会发生很大的变化;3)如果窗口包含一个孤立的点或者角点,那么所有不同方向的偏移会发生很大的变化。
面给出具体数学推导:设图像窗口平移量为( u,v) ,产生的灰度变化为E(u,v),有E(u,v)二sum[w(x,y)[l(x+u,y+v)-l(x,y)F2棋中w(x,y)为窗口函数, l(x+u,y+v为平移后的灰度值,l(x,y)为平移前的灰度值。
有泰勒公式展开可得:l(x+u,y+v)=l(x,y)+lx*u+ly*v+0(uA2,v八2);lx,ly分别为偏微分,在图像中为图像的方向导数因此E(u,v)=sum[w(x,y) [lx*u+ly*v+O(u八2,v八2)]八2],可以近似得到E(u,v)=sum[w(x,y) [lx*u+ly*v]^2],即E(u,v)二[u,v][lx八2,lx*ly;lx*ly,ly八2][u,v]T令M=[lx八2,lx*ly;lx*ly,ly八2],因此最后对角点的检测成了对矩阵M的特征值的分析了,令M 其特征值为x1,x2;当x1>>x2或者x2>>x1,则检测到的是边缘部分;当x1,x2都很小,图像窗口在所有移动的方向上移动灰度级都无明显变化.当X1,X2都很大时且相当,检测到的是角点。
编程时用x1,x2不方便,因此定义角点响应函数;R二det(M)-k(trace(M))八2;其中det(M)为矩阵M的行列式,trace(M)为矩阵M的迹。
harris角点响应函数Harris角点响应函数是计算机视觉领域中常用的一种算法,用于检测图像中的角点。
它由Cornell大学的Chris Harris和Mike Stephens在1988年提出。
在计算机视觉中,角点是指在图像中一个突出的、由多个边缘交汇而成的点,通常具有高强度变化的特征。
角点在图像处理和计算机视觉中应用广泛,如图像配准、物体识别、追踪等。
Harris角点响应函数的基本思想是通过计算像素在不同方向上的灰度变化率来确定角点,即角点处的像素在多个方向上都具有较高的灰度变化率。
因为角点处的像素在不同方向上都具有明显的边缘变化,而直线和平面上的像素只有在一个方向上具有明显的边缘变化。
具体地,Harris角点响应函数可以通过以下公式计算:R = det(M) - k(trace(M))^2其中,M是一个2x2的矩阵,它的两个分量分别是像素在不同方向上的梯度值的平方和,即M = sum(w(x,y)[dx^2(x,y), dx(x,y)dy(x,y); dx(x,y)dy(x,y), dy^2(x,y)])在这个公式中,dx(x,y)=I(x+1,y) - I(x,y)和dy(x,y)=I(x,y+1) - I(x,y)是像素在x和y方向上的梯度值,I(x,y)是图像在位置(x,y)处的灰度值。
w(x,y)是一个窗口函数,用于权衡像素的贡献,通常采用高斯函数。
k是一个经验值,用于控制角点的检测程度,一般取值在0.04到0.06之间。
通过计算像素点的响应值R,可以判断该点是否为角点。
R值较大的像素点很可能是角点,而R值较小的像素点则可能是平面或边缘上的像素点。
Harris角点响应函数的优点是能够检测不同大小和方向的角点,而且计算效率较高。
然而,它也存在一些限制,如对噪声敏感和对图像亮度变化敏感等问题。
因此,在实际应用中需要根据具体情况加以调整和改进。
Opencv python角点检测函数输出坐标OpenCV是一个强大的计算机视觉库,提供了许多图像处理和计算机视觉功能。
在OpenCV中,角点检测是通过Harris角点检测或者SIFT(尺度不变特征变换)等方法来完成的。
在Python中使用OpenCV进行角点检测的基本步骤如下:1. 读取图像2. 转换为灰度图像3. 使用角点检测算法找到角点4. 输出角点坐标下面是一个使用OpenCV进行Harris角点检测并输出角点坐标的Python代码示例:```pythonimport cv2import numpy as np# 读取图像image = cv2.imread('image.jpg')# 转换为灰度图像gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# Harris角点检测参数blockSize = 2aperture = 3winSize = (15,15)# Harris角点检测dst = cv2.cornerHarris(gray, blockSize, aperture, winSize)# 对Harris值进行归一化,使其在0-255之间dst = cv2.normalize(dst, None, 0, 255, cv2.NORM_MINMAX)# 使用阈值确定哪些是角点,阈值可以根据实际情况调整# 这里使用的是3个像素的阈值,即如果某个像素的值大于3*3的窗口中的其他8个像素值,则认为这个像素是角点threshold = 3points = np.uint8(dst > threshold)# 找到角点并输出坐标if points.any():print("找到角点:")for (x, y) in np.where(points == 1):print(f"({x}, {y})")else:print("未找到角点")```在这个示例中,我们首先读取一张图像并将其转换为灰度图像。
光流法特征点提取光流法是一种用于运动分析和目标跟踪的计算机视觉方法,它可以在图像序列中检测和跟踪特征点的运动。
光流法的基本原理是通过比较连续帧之间的图像亮度差异来推导特征点的运动速度和方向。
特征点提取是光流法的关键步骤之一,它的目的是选择出具有稳定特征的像素点用于计算光流场。
以下是一些常用的特征点提取方法和参考内容:1. Harris角点检测算法:Harris角点检测算法是一种常用的特征点提取算法,它根据图像局部区域的灰度变化来检测角点。
该算法计算每个像素点的角点响应值,然后根据阈值筛选出具有较高角点响应值的像素点作为特征点。
参考内容可以是《Harris角点检测算法原理及实现》的博客文章或相关的论文。
2. Shi-Tomasi角点检测算法:Shi-Tomasi角点检测算法是对Harris角点检测算法的改进,它根据图像局部区域的最小特征值来检测角点。
通过计算每个像素点的特征值,然后根据阈值和最小特征值进行筛选,得到角点作为特征点。
参考内容可以是《Good Features to Track》的论文或相关的博客文章。
3. FAST角点检测算法:FAST角点检测算法是一种快速的特征点提取算法,它通过对像素点周围的圆周上的像素进行比较来检测角点。
该算法通过判断像素点周围的像素是否连续具有较大或较小的灰度差异来确定是否为角点。
参考内容可以是《Machine Learning for High-speed Corner Detection》的论文或相关的博客文章。
4. SIFT特征点提取算法:尺度不变特征变换(Scale-Invariant Feature Transform,SIFT)是一种具有较强鲁棒性的特征点提取算法,它可以在不同尺度和图像旋转情况下检测到相同的特征点。
该算法通过计算DoG(Difference of Gaussians)图像金字塔,并检测尺度空间极值点来选择出特征点。
参考内容可以是《Distinctive Image Features from Scale-Invariant Keypoints》的论文或相关的博客文章。
控制点检测方法一、引言控制点检测是计算机视觉领域中的一项重要任务,其目的是在图像或视频中准确定位和识别出特定的控制点。
控制点通常是一些具有明确特征的点,可以用于图像配准、三维重建、姿态估计等应用中。
本文将介绍几种常用的控制点检测方法,并对其原理和应用进行详细阐述。
二、特征点检测特征点检测是控制点检测的基础,它通过寻找图像中具有独特性质的像素点,用于表示图像的特定区域。
常见的特征点包括角点、边缘点、斑点等。
特征点检测的目标是找出具有鲁棒性和区分度的特征点,以便后续的匹配和跟踪。
1. Harris角点检测Harris角点检测是一种常用的特征点检测方法,它通过计算图像中每个像素点的角点响应函数,来判断该点是否为角点。
角点响应函数基于像素点的局部灰度变化和邻域窗口的自相关矩阵,通过计算特征值来判断角点的存在与否。
Harris角点检测方法具有简单、快速和鲁棒性好的特点,广泛应用于图像配准、目标跟踪等领域。
2. SIFT特征点检测尺度不变特征变换(SIFT)是一种基于局部图像特征的检测方法,它通过在不同尺度空间中寻找极值点,并提取出具有独特性质的SIFT描述子。
SIFT特征点检测方法具有旋转不变性和尺度不变性的优点,适用于大尺度和小尺度的图像配准和匹配任务。
三、控制点匹配控制点匹配是将两幅或多幅图像中的特征点进行对应的过程,目的是找到它们之间的几何关系。
控制点匹配可以通过特征描述子的相似性度量来实现,常用的方法包括最近邻匹配、RANSAC算法等。
1. 最近邻匹配最近邻匹配是一种简单直观的匹配方法,它将一个特征点与另一幅图像中最相似的特征点进行匹配。
匹配的相似性度量通常使用欧氏距离或汉明距离。
最近邻匹配方法简单易实现,但对于存在噪声和遮挡的情况,容易产生错误的匹配。
2. RANSAC算法RANSAC(Random Sample Consensus)算法是一种鲁棒的参数估计方法,常用于控制点匹配中的模型拟合。
它通过随机选择一组数据样本,计算模型参数,并统计符合模型的样本数目。
关键点检测技术简介关键点检测技术是计算机视觉领域中的一项重要技术,它可以在图像或视频中自动检测出一些重要的特征点,这些特征点可以用于图像匹配、目标跟踪、三维重建等应用。
本文将对关键点检测技术进行简要介绍。
一、关键点检测的基本原理关键点检测的基本原理是在图像中寻找一些具有显著性、不易受到图像变换影响的特征点。
这些特征点可以是角点、边缘点、斑点等。
在检测过程中,通常会使用一些特定的算法来寻找这些特征点,例如Harris角点检测算法、SIFT算法、SURF算法等。
二、常用的关键点检测算法1. Harris角点检测算法Harris角点检测算法是一种基于图像灰度变化的角点检测算法。
它通过计算图像中每个像素点的灰度值变化率,来判断该点是否为角点。
该算法简单易懂,计算速度快,但对于一些复杂的图像场景,检测效果可能不太理想。
2. SIFT算法SIFT算法是一种基于尺度空间的关键点检测算法。
它通过在不同尺度下对图像进行高斯滤波,来寻找具有不同尺度的特征点。
该算法具有较好的旋转、缩放不变性,但计算量较大,对于实时性要求较高的应用场景不太适用。
3. SURF算法SURF算法是一种基于加速图像特征点检测的算法。
它通过使用快速哈希表等数据结构,来加速特征点的匹配和识别。
该算法具有较好的计算速度和鲁棒性,但对于一些复杂的图像场景,检测效果可能不太理想。
三、关键点检测的应用关键点检测技术在计算机视觉领域中有着广泛的应用。
例如,在图像匹配中,可以使用关键点检测技术来寻找两幅图像中的相同特征点,从而实现图像的对齐和融合。
在目标跟踪中,可以使用关键点检测技术来跟踪目标的运动轨迹。
在三维重建中,可以使用关键点检测技术来提取物体表面的特征点,从而实现三维模型的重建。
关键点检测技术是计算机视觉领域中的一项重要技术,它可以为图像匹配、目标跟踪、三维重建等应用提供有力的支持。
随着计算机视觉技术的不断发展,关键点检测技术也将不断得到改进和完善,为更多的应用场景提供更好的服务。
角点检测(Corner Detection)角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维建模和目标识别等领域中。
也称为特征点检测。
角点通常被定义为两条边的交点,更严格的说,角点的局部邻域应该具有两个不同区域的不同方向的边界。
而实际应用中,大多数所谓的角点检测方法检测的是拥有特定特征的图像点,而不仅仅是“角点”。
这些特征点在图像中有具体的坐标,并具有某些数学特征,如局部最大或最小灰度、某些梯度特征等。
现有的角点检测算法并不是都十分的鲁棒。
很多方法都要求有大量的训练集和冗余数据来防止或减少错误特征的出现。
角点检测方法的一个很重要的评价标准是其对多幅图像中相同或相似特征的检测能力,并且能够应对光照变化、图像旋转等图像变化。
角点检测的方法有:Moravec角点检测算法,FAST角点检测算法,Harris角点检测法和shi_tomas角点检测法等。
1.1.1Moravec角点检测算法Moravec角点检测算法Moravec角点检测算法是最早的角点检测算法之一。
该算法将角点定义为具有低“自相关性”的点。
算法会检测图像的每一个像素,将像素周边的一个邻域作为一个patch,并检测这个patch和周围其他patch 的相关性。
这种相关性通过两个patch间的平方差之和(SSD)来衡量,SSD值越小则相似性越高。
如果像素位于平滑图像区域内,周围的patch都会非常相似。
如果像素在边缘上,则周围的patch在与边缘正交的方向上会有很大差异,在与边缘平行的方向上则较为相似。
而如果像素是各个方向上都有变化的特征点,则周围所有的patch都不会很相似。
Moravec会计算每个像素patch和周围patch的SSD最小值作为强度值,取局部强度最大的点作为特征点。
Moravec角点检测算法有几个很明显的缺陷:1,强度值的计算并不是各向同性的,只有离散的8个45度角方向被考虑。
[filename,pathname,~]=uigetfile('*.jpg','选择JPG格式图片');if ~ischar(filename)returnendstr=[pathname filename];pic=imread(str);if length(size(pic))==3img=rgb2gray(pic);end[m,n]=size(img);tmp=zeros(m+2,n+2);tmp(2:m+1,2:n+1)=img; %扩展图像边缘1个像素Ix=zeros(m+2,n+2);Iy=zeros(m+2,n+2);Ix(:,2:n+1)=tmp(:,3:n+2)-tmp(:,1:n); % x方向上的差分Iy(2:m+1,:)=tmp(3:m+2,:)-tmp(1:m,:); % y方向上的差分Ix2=Ix(2:m+1,2:n+1).^2;Iy2=Iy(2:m+1,2:n+1).^2;Ixy=Ix(2:m+1,2:n+1).*Iy(2:m+1,2:n+1);h=fspecial('gaussian',[7 7],2); %生成高斯滤波器,消弱噪声的影响Ix2=filter2(h,Ix2); %滤波Iy2=filter2(h,Iy2);Ixy=filter2(h,Ixy);R=zeros(m,n);for i=1:mfor j=1:nM=[Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)]; %构造Hessian矩阵R(i,j)=det(M)-0.06*(trace(M))^2; %角点判定公式endendRmax=max(max(R));loc=[]; %记录角点位置tmp(2:m+1,2:n+1)=R; %扩展图像边缘1个像素for i=2:m+1for j=2:n+1if tmp(i,j)>0.01*Rmax %要求矩阵R中的每个元素值大于0.01倍的最大值sq=tmp(i-1:i+1,j-1:j+1);sq=reshape(sq,1,9);sq=[sq(1:4),sq(6:9)];if tmp(i,j)>sq %局部非极大值抑制loc=[loc;[j-1,i-1]];endendendend%以下代码显示获取的Harris角点X=loc(:,1);Y=loc(:,2);subplot(1,2,1);imshow(pic);subplot(1,2,2);imshow(pic);hold on plot(X,Y,'*');hold off。
常见特征检测算法介绍特征检测算法是计算机视觉领域中常用的技术之一,用于从图像或视频中提取出具有一定重要性或者代表性的特征点或区域。
这些特征点或者区域可以帮助我们进行图像匹配、物体识别、边缘检测等任务。
下面将介绍几种常见的特征检测算法。
1.SIFT(尺度不变特征变换)SIFT是一种基于局部特征的算法,最初由Lowe 在1999 年提出。
它通过寻找图像中的尺度和旋转不变性的关键点,来提取特征点。
SIFT 算法先对图像进行多尺度的高斯滤波,然后计算出尺度空间极值点。
随后,选取关键点并计算其主方向。
最后,通过在关键点周围的窗口里计算梯度直方图,生成特征描述子。
2.SURF(加速稳健特征)SURF是一种快速且具有不变性的特征检测算法,由Bay等人于2024年提出。
它采用了一种叫做积分图像的计算方法来加速特征的提取过程。
SURF 的关键点提取过程与SIFT 类似,但是采用了一种叫作Haar小波响应的方法来计算特征描述子。
3.FAST(特征快速)FAST 是一种具有高速性能的角点检测算法,由Rosten 和Drummond 在2024年提出。
它通过比较像素点灰阶值和邻域像素点的灰阶值来判断是否为关键点。
FAST 算法具有简单、快速和鲁棒的特点,被广泛应用于图像和视频中特征点的检测。
4. Harris 角点检测算法Harris 角点检测算法是一种基于图像灰度变化的特征检测算法,由Harris和Stephens 在1988 年提出。
它通过计算图像灰度在不同方向上的变化率,来判断一些像素点是否为角点。
Harris 角点检测算法简单、快速,且对光照变化和图像旋转具有一定的不变性。
5. ORB(Oriented FAST and Rotated BRIEF)ORB 是一种特征点检测和描述子生成算法,由Rublee等人于2024年提出。
ORB 算法结合了FAST 点检测和BRIEF 描述子生成算法,同时引入了旋转不变性和仿射不变性,提高了算法的鲁棒性和性能。
一、Harris角点检测基本理论1.1 简略表达:角点:最直观的印象就是在水平、竖直两个方向上变化均较大的点,即Ix、Iy都较大边缘:仅在水平、或者仅在竖直方向有较大的变化量,即Ix和Iy只有其一较大平坦地区:在水平、竖直方向的变化量均较小,即Ix、Iy都较小角点响应R=det(M)-k*(trace(M)^2) (附录资料给出k=0.04~0.06,opencv指出是0.05-0.5,浮动较大)det(M)=λ1*λ2trace(M)=λ1+λ2R取决于M的特征值,对于角点|R|很大,平坦的区域|R|很小,边缘的R为负值。
1.2 详细描述:见附录里的ppt1.3 算法步骤其中,局部极大值可用先膨胀后与原图比较的方法求得,具体见二中源码。
二、opencv代码实现harris类[cpp]view plaincopyprint?1. #ifndef HARRIS_H2. #define HARRIS_H3. #include "opencv2/opencv.hpp"4.5. class harris6. {7. private:8. cv::Mat cornerStrength; //opencv harris函数检测结果,也就是每个像素的角点响应函数值9. cv::Mat cornerTh; //cornerStrength阈值化的结果10. cv::Mat localMax; //局部最大值结果11. int neighbourhood; //邻域窗口大小12. int aperture;//sobel边缘检测窗口大小(sobel获取各像素点x,y方向的灰度导数)13. double k;14. double maxStrength;//角点响应函数最大值15. double threshold;//阈值除去响应小的值16. int nonMaxSize;//这里采用默认的3,就是最大值抑制的邻域窗口大小17. cv::Mat kernel;//最大值抑制的核,这里也就是膨胀用到的核18. public:19. harris():neighbourhood(3),aperture(3),k(0.01),maxStrength(0.0),threshold(0.01),nonMaxSize(3){20.21. };22.23. void setLocalMaxWindowsize(int nonMaxSize){24. this->nonMaxSize = nonMaxSize;25. };26.27. //计算角点响应函数以及非最大值抑制28. void detect(const cv::Mat &image){29. //opencv自带的角点响应函数计算函数30. cv::cornerHarris (image,cornerStrength,neighbourhood,aperture,k);31. double minStrength;32. //计算最大最小响应值33. cv::minMaxLoc (cornerStrength,&minStrength,&maxStrength);34.35. cv::Mat dilated;36. //默认3*3核膨胀,膨胀之后,除了局部最大值点和原来相同,其它非局部最大值点被37. //3*3邻域内的最大值点取代38. cv::dilate (cornerStrength,dilated,cv::Mat());39. //与原图相比,只剩下和原图值相同的点,这些点都是局部最大值点,保存到localMax40. cv::compare(cornerStrength,dilated,localMax,cv::CMP_EQ);41. }42.43. //获取角点图44. cv::Mat getCornerMap(double qualityLevel) {45. cv::Mat cornerMap;46. // 根据角点响应最大值计算阈值47. threshold= qualityLevel*maxStrength;48. cv::threshold(cornerStrength,cornerTh,49. threshold,255,cv::THRESH_BINARY);50. // 转为8-bit图51. cornerTh.convertT o(cornerMap,CV_8U);52. // 和局部最大值图与,剩下角点局部最大值图,即:完成非最大值抑制53. cv::bitwise_and(cornerMap,localMax,cornerMap);54. return cornerMap;55. }56.57. void getCorners(std::vector<cv::Point> &points,58. double qualityLevel) {59. //获取角点图60. cv::Mat cornerMap= getCornerMap(qualityLevel);61. // 获取角点62. getCorners(points, cornerMap);63. }64.65. // 遍历全图,获得角点66. void getCorners(std::vector<cv::Point> &points,67. const cv::Mat& cornerMap) {68.69. for( int y = 0; y < cornerMap.rows; y++ ) {70. const uchar* rowPtr = cornerMap.ptr<uchar>(y);71. for( int x = 0; x < cornerMap.cols; x++ ) {72. // 非零点就是角点73. if (rowPtr[x]) {74. points.push_back(cv::Point(x,y));75. }76. }77. }78. }79.80. //用圈圈标记角点81. void drawOnImage(cv::Mat &image,82. const std::vector<cv::Point> &points,83. cv::Scalar color= cv::Scalar(255,255,255),84. int radius=3, int thickness=2) {85. std::vector<cv::Point>::const_iterator it=points.begin();86. while (it!=points.end()) {87. // 角点处画圈88. cv::circle(image,*it,radius,color,thickness);89. ++it;90. }91. }92.93. };94.95. #endif // HARRIS_H相关测试代码:[cpp]view plaincopyprint?1. cv::Mat image, image1 = cv::imread ("test.jpg");2. //灰度变换3. cv::cvtColor (image1,image,CV_BGR2GRAY);4.5.6. // 经典的harris角点方法7. harris Harris;8. // 计算角点9. Harris.detect(image);10. //获得角点11. std::vector<cv::Point> pts;12. Harris.getCorners(pts,0.01);13. // 标记角点14. Harris.drawOnImage(image,pts);15.16. cv::namedWindow ("harris");17. cv::imshow ("harris",image);18. cv::waitKey (0);19. return 0;相关测试结果:三、改进的Harris角点检测从经典的Harris角点检测方法不难看出,该算法的稳定性和k有关,而k是个经验值,不好把握,浮动也有可能较大。