OpenCV特征检测问题

这篇不讲原理,只讲怎么实现。
OpenCV常用的特征检测和提取算法有:

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

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

  • 暴力(Brute-Force)匹配法

  • 基于FLANN的匹配法

Harris角点

OpenCV使用cornerHarris来识别角点,代码如下:

"""Harris角点检测"""
import cv2
import numpy as np

img = cv2.imread('D:/codes/shan.jpg')#这里使用的绝对路径,可以看着改
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray =np.float32(gray)

dst=cv2.cornerHarris(gray,2,15,0.04)#第三个参数取值3-31之间,,定义了角点检测的灵敏度
img[dst>0.01*dst.max()]=[0,0,255]#将检测到的角点标记为红色


cv2.imshow('corcers',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

为了使cornerHarris函数可以计算,需将图片转为会都格式,然后调用cornerHarris函数:

dst=cv2.cornerHarris(gray,2,15,0.04)

这里最重要的参数是第三个,该算子限定了Sobel算子的中孔(aperture)。Sobel算子通过对图像列、行的变换来检测边缘,Sobel算子会通过核(kernel)来完成检测。也就是说cornerHarris函数会使用Sobel算子,并且第三个参数定义了Sobel算子的中孔,即该参数定义了角点检测的灵敏度,取值在[3,31]奇数。

OpenCV中cornerHarris函数如下:
dst=cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])

参数:

  • src – 输入单通道8位浮点型图像
  • dst – 输出储存矩阵。size等同于输入,类型是 typeCV_32FC1 。
  • blockSize – Neighborhood size (see the details on cornerEigenValsAndVecs() ).其值越小,标记角点的记号越小
  • ksize – Sobel 求导中使用的窗口大小
  • k – Harris 角点检测方程中的自由参数,取值参数为[0,04,0.06].
  • borderType – Pixel extrapolation method. see borderInterpolate() .
    OpenCV特征检测问题_第1张图片

SIFT尺度不变特征变换

SIFT对象会使用DoG检测关键点,并对每个关键点周围的区域计算特征向量。由名字detectAndCompute可知他只执行俩个主要操作:检测和计算,同时其返回值是关键点信息(关键点)和描述符。DoG是对同一图像使用不同高斯滤波器所得到的结果。


import cv2
#import numpy as np

img = cv2.imread('D:/codes/shan.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#创建SIFT对象
sift = cv2.xfeatures2d.SIFT_create()
keypoints, descriptor = sift.detectAndCompute(gray,None)

img = cv2.drawKeypoints(image=img, outImage=img, 
                        keypoints = keypoints, flags = 4, color = (51, 163, 236))
cv2.imshow("img", img)
cv2.waitKey() 
cv2.destroyAllWindows()

效果如下:
OpenCV特征检测问题_第2张图片

SURF

SIFT和SURF都受专利保护,故而被归类到OpenCV的xgeature2d模块中。SURF是OpenCV的一个类,SURF采用快速Hessian算法检测关键点。

import cv2


img = cv2.imread('D:/codes/shan.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
surf=cv2.xfeatures2d.SURF_create()

keypoints, descriptor = surf.detectAndCompute(gray,None)

img = cv2.drawKeypoints(image=img, outImage=img, 
                        keypoints = keypoints, flags = 4, color = (51, 163, 236))

cv2.imshow("img", img)

k = cv2.waitKey(0)
if k & 0xff == 27:
    cv2.destroyAllWindows()

OpenCV特征检测问题_第3张图片

你可能感兴趣的:(图像处理算法)