OpenCv学习笔记9--Harris角点检测

此opencv系列博客只是为了记录本人对<>的学习笔记,所有代码在我的github主页https://github.com/RenDong3/OpenCV_Notes.

欢迎star,不定时更新...

OpenCV可以检测图像的主要特征,然后提取这些特征、使其成为图像描述符,这类似于人的眼睛和大脑。这些图像特征可作为图像搜索的数据库。此外,人们可以利用这些关键点将图像拼接起来,组成一个更大的图像,比如将许多图像放在一块,然后形成一个360度全景图像。

这里我们将学习使用OpenCV来检测图像特征,并利用这些特征进行图像匹配和搜索。我们会选取一些图像,并通过单应性,检测这些图像是否在另一张图像中。

一 特征检测算法

有许多用于特征检测和提取的算法,我们将会对其中大部分进行介绍。OpenCV最常使用的特征检测和提取算法有:

  • Harris:该算法用于检测角点;
  • SIFT:该算法用于检测斑点;
  • SURF:该算法用于检测角点;
  • FAST:该算法用于检测角点;
  • BRIEF:该算法用于检测斑点;
  • ORB:该算法代表带方向的FAST算法与具有旋转不变性的BRIEF算法;

通过以下方法进行特征匹配:

  • 暴力(Brute-Force)匹配法;
  • 基于FLANN匹配法;

可以采用单应性进行空间验证。

二 特征定义

那么,究竟什么是特征呢?为什么一副图像的某个特定区域可以作为一个特征,而其他区域不能呢?粗略的讲,特征就是有意义的图像区域,该区域具有独特特征和易于识别性。因此角点及高密度区域都是很好的特征,而大量重复的模式或低密度区域(例如图像中的蓝色天空)则不是很好的特征。边缘可以将图像分为两个区域,因此也可以看做好的特征。斑点是与周围有很大差别的像素区域,也是有意义的特征。

大多数特征检测算法都会涉及图像的角点、边和斑点的识别,也有一些涉及脊向的概念,可以认为脊向是细长物体的对称轴,例如识别图像中的一条路。角点和边都和哦理解,那什么是斑点呢?斑点通常是指与周围有着颜色和灰度差别的区域。在实际地图中,往往存在着大量这样的斑点,如一颗树是一个斑点,一块草地是一个斑点,一栋房子也可以是一个斑点。由于斑点代表的是一个区域,相比单纯的角点,它的稳定性要好,抗噪声能力要强,所以它在图像配准上扮演了很重要的角色。

由于某些算法在识别和提取某类型特征的时候有较好的效果,所以知道输入图像是什么很重要,这样做有利于选择最合适的OpenCV工具包。

三 Harris检测角点特征

下面我们从使用cornerHarris()函数讲起。

cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]]) → dst

参数详解:

  • image:输入的单通道8位或者浮点图像;
  • blockSize:就是扫描时候窗口的大小。
  • ksize:cornerHarris函数会使用Sobel算子,该参数定义了Sobel算子的中孔。简单来说,该函数定义了角点检测的敏感度,其值必须介于3~31之间的奇数。
  • k:harris 计算响应公式中的kk值,一般取0.04~0.06;
  • borderType:像素插值方法;

函数 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()

运行结果如下:

OpenCv学习笔记9--Harris角点检测_第1张图片

本人只是对Harris角点检测code进行了复现,对于其原理并没有深究,所以这里并未列出其具体原理,感兴趣的童鞋可以去到本人一直作为参考的大神的博客去观看浏览,里面有对原理的详细解释.链接放在下面了.

https://www.cnblogs.com/zyly/p/9508131.html 

你可能感兴趣的:(OpenCV笔记,Harris)