OpenCV可以检测图像的主要特征,然后提取这些特征、使其成为图像描述符,这类似于人的眼睛和大脑。这些图像特征可作为图像搜索的数据库。此外,人们可以利用这些关键点将图像拼接起来,组成一个更大的图像,比如将许多图像放在一块,然后形成一个360度全景图像。
这里我们将学习使用OpenCV来检测图像特征,并利用这些特征进行图像匹配和搜索。我们会选取一些图像,并通过单应性,检测这些图像是否在另一张图像中。
有许多用于特征检测和提取的算法,我们将会对其中大部分进行介绍。OpenCV最常使用的特征检测和提取算法有:
通过以下方法进行特征匹配:
可以采用单应性进行空间验证。
那么,究竟什么是特征呢?为什么一副图像的某个特定区域可以作为一个特征,而其他区域不能呢?粗略的讲,特征就是有意义的图像区域,该区域具有独特特征和易于识别性。因此角点及高密度区域都是很好的特征,而大量重复的模式或低密度区域(例如图像中的蓝色天空)则不是很好的特征。边缘可以将图像分为两个区域,因此也可以看做好的特征。斑点是与周围有很大差别的像素区域,也是有意义的特征。
大多数特征检测算法都会涉及图像的角点、边和斑点的识别,也有一些涉及脊向的概念,可以认为脊向是细长物体的对称轴,例如识别图像中的一条路。角点和边都和哦理解,那什么是斑点呢?斑点通常是指与周围有着颜色和灰度差别的区域。在实际地图中,往往存在着大量这样的斑点,如一颗树是一个斑点,一块草地是一个斑点,一栋房子也可以是一个斑点。由于斑点代表的是一个区域,相比单纯的角点,它的稳定性要好,抗噪声能力要强,所以它在图像配准上扮演了很重要的角色。
由于某些算法在识别和提取某类型特征的时候有较好的效果,所以知道输入图像是什么很重要,这样做有利于选择最合适的OpenCV工具包。
下面我们从使用cornerHarris()函数讲起。
cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]]) → dst
参数详解:
函数 cornerHarris 对输入图像进行 Harris 边界检测。输出是一幅浮点值图像,大小与输入图像大小相同,浮点值越高,表明越可能是特征角点(我们可以对图像进行阈值化)。
完整代码如下:
#-*- coding:utf-8 -*-
import os
import cv2
import numpy as np
'''
created on 08:05:10 2018-11-20
@author ren_dong
使用cornerHarris进行角点检测
cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]]) → dst
'''
img = cv2.imread('chess.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray= np.float32(gray)
#第三个参数定义了角点检测的敏感度,其值必须是介于3和31之间的奇数
##dst为函数返回的浮点值图像,其中包含角点检测结果
#第二个参数值决定了标记角点的记号大小,参数值越小,记号越小
dst = cv2.cornerHarris(gray, 4, 23, 0.04)
print dst.shape
#在原图进行标记 阈值
img[dst > 0.01*dst.max()] = [0, 0, 255]
while(True):
cv2.imshow('Harris', img)
if cv2.waitKey(100) & 0xff == ord('q'):
break
cv2.destroyAllWindows()
运行结果如下:
本人只是对Harris角点检测code进行了复现,对于其原理并没有深究,所以这里并未列出其具体原理,感兴趣的童鞋可以去到本人一直作为参考的大神的博客去观看浏览,里面有对原理的详细解释.链接放在下面了.
https://www.cnblogs.com/zyly/p/9508131.html