类似于人的眼睛和大脑,OpenCV可以检测图像的主要特征并将这 些特征提取到所谓的图像描述符中。然后,可以将这些特征作为数据
库,支持基于图像的搜索。此外,我们可以使用关键点将图像拼接起 来,组成更大的图像。(想象一下把很多图片放到一起组成一幅360°的全景图。)
本节将展示如何使用OpenCV检测图像中的特征,并利用这些特征
匹配和检索图像。在本节的学习过程中,我们会获取样本图像并检测
其主要特征,然后试着在另一幅图像中找到与样本图像匹配的区域。
我们还将找到样本图像和另一幅图像匹配区域之间的单应性或者空间
关系。
Harris角点检测是计算机视觉领域中一种经典的角点检测算法,它可以用于许多应用场景。
以下是一些Harris角点检测的应用场景:
图像配准: 在图像配准中,Harris角点检测可以用于找到两幅图像中具有相似特征的角点,从而进行图像对齐和匹配。
物体跟踪: 在目标跟踪中,Harris角点检测可以用于提取图像中的显著特征,帮助识别和跟踪目标。
摄像头标定: 在摄像头标定中,Harris角点检测可以用于检测摄像头拍摄图像中的角点,帮助计算摄像头的内参和外参。
三维重建: 在三维重建中,Harris角点检测可以用于提取图像中的关键特征点,帮助建立图像间的对应关系,从而实现场景的三维重建。
物体识别: 在物体识别中,Harris角点检测可以用于提取图像中的特征点,帮助识别和分类不同的物体。
自动驾驶: 在自动驾驶领域,Harris角点检测可以用于检测图像中的道路边缘和关键特征,帮助自动驾驶系统判断道路情况。
图像拼接: 在图像拼接中,Harris角点检测可以用于提取图像中的角点,帮助找到不同图像之间的对应关系,实现图像拼接和全景图生成。
图像匹配: 在图像匹配中,Harris角点检测可以用于寻找两幅图像中具有相似特征的角点,从而进行图像配准和匹配。
理解特征检测和匹配的类型
OpenCV中最常用的特征检测和描述符提取算法如下:
- Harris:该算法适用于角点检测。
- SIFT:该算法适用于斑点检测。
- SURF:该算法适用于斑点检测。
- FAST:该算法适用于角点检测。
- BRIEF:该算法适用于斑点检测。
- ORB:它是Oriented FAST和Rotated BRIEF的联合缩写。ORB对于角点和斑点的组合检测很有用。
可以通过下列方法进行特征匹配:
- 蛮力匹配。
- 基于FLANN的匹配。
可以通过单应性进行空间验证。
究竟什么是特征?
为什么图像的某个特定区域可以归类为特征,而其他区域则不能分类为特征呢?广义地说,特征是图像中独特或容易识别的一个感兴趣区域。具有高密度纹理细节的角点和区域是好的特征,而在低密度区域(如蓝天)不断重复出现的模式就不是好的特征。边缘是好的特征,因为它们倾向于把图像分割成两个区域。斑点(与周围区域有很大差别的图像区域)也是一个有趣的特征。
大多数特征检测算法都围绕着角点、边缘和斑点的识别展开,有
些还关注岭(ridge)的概念,其中岭可以概念化为细长物体的对称
轴。(例如,想象一下识别图像中的道路。)
有些算法更擅长识别和提取特定类型的特征,所以了解输入图像
是什么很重要,这样就可以利用OpenCV中的最佳工具了。
检测Harris角点
什么是角点?
在计算机视觉和图像处理中,角点(Corner)是图像中突出的、有角度的、明显的像素点。角点通常位于图像中物体的边缘、纹理或其他特征的交叉点,是图像中的显著特征点。角点对于图像处理中的许多任务,如特征匹配、目标跟踪、3D重建等,具有重要的作用。
角点具有以下特征:
局部极大值: 在角点周围的邻域中,角点的像素值应该是局部最大值。
方向变化: 角点处的像素点方向会在不同方向上有较大的变化,这是因为角点是明显的图像特征。
明暗对比: 角点处的像素点周围可能是明暗对比较大的区域,因为角点是由物体的边缘、纹理等特征交叉形成的。
可重复性: 角点在不同的尺度和旋转下仍然可以被检测到,这使得它们在不同场景中都有用途。
下面看一下角点的类型:
cv2.cornerHarris 函数说明
dst=cv2.cornerHarris(img, blockSize, ksize, k)
公式中参数:
- img表示原始图像
- blockSize表示角点检测中的领域大小
- ksize表示Sobel求导中使用的窗口大小
- k表示Harris 角点检测方程中的自由参数,取值参数为[0,04, 0.06]
代码示例:
import numpy as np
import cv2
# 读取待检测的图像
img = cv2.imread('chess_board.png')
# 转换为灰度图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
# 调用函数 cornerHarris,检测角点,其中参数 2 表示 Sobel 算子的孔径大小,23 表示 Sobel 算子的孔径大小,0.04 表示 Harris 角点检测方程中的 k 值
dst = cv2.cornerHarris(gray,2,23,0.04)
dst = cv2.dilate(dst,None)
# 将检测到的角点标记出来
img[dst>0.01*dst.max()]=[0,0,255]
cv2.imshow('dst',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行效果:
这里,我们选取的像素的分值至少是最高分值的1%,并在原始图
像中将这些像素涂成红色。