OpenCV_09特征检测

前言:更多请看《计算机视觉学习路》

应用场景:

  • 图像搜索,如百度搜图(传入一张图片后找到相似的图片)
  • 拼图游戏,找到一块很容易找到和他临接的另一块
  • 图像拼接,将两张有关联的图拼接到一起

图像特征是具有独特性,易于识别性,比如角点斑点以及高密度区

角点:灰度梯度的最大值对应的像素、两条线的交点、极值点

Harris角点

cornerHarris(img , blockSize , ksize ,k)

blockSize : 检测窗口大小

ksize : Sobel的卷积核

k : 权重系数,经验值,一般取0.02-0.04

其基本思想为:

OpenCV_09特征检测_第1张图片

下图中红色的点就是Harris角点 

OpenCV_09特征检测_第2张图片

import cv2
import numpy as np

img = cv2.imread('../img/ex03.jpg')

blockSize = 2
ksize = 3
k = 0.04

# 灰度化才能进行角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Harris角点检测
dst = cv2.cornerHarris(gray, blockSize, ksize, k)

#角点展示
img[dst > 0.01*dst.max()] = [0,0,255]

cv2.imshow('harris',img)

cv2.waitKey(0)

Shi-Tomasi角点 

该方法是Harris角点检测的改进,因为k是一个经验值,不好设置,所以该方法不需要设置k

goodFeatursToTrack(img , maxCorners,...)

maxCorners : 角点的最大数,值为0表示无限制

qualityLevel : 小于1的正数,一般在0.01-0.1之间

minDistance : 角之间最小欧式距离,忽略小于此距离的点,距离越大,检测到的角点越少

mask : 感兴趣区域

blockSize : 检测窗口大小

useHarrisDetector : 是否使用Harris算法  true , false  默认false

k : 当使用Harrris时需要设置,默认0.04

效果如下: OpenCV_09特征检测_第3张图片

import cv2
import numpy as np

img = cv2.imread('../img/ex03.jpg')

maxCorners = 1000
ql = 0.01
minDistance = 10

# 灰度化才能进行角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Harris角点检测
corners = cv2.goodFeaturesToTrack(gray, maxCorners, ql, minDistance)
corners = np.int0(corners)

# 绘制角点
for i in corners:
    x, y = i.ravel()
    cv2.circle(img, (x, y), 3, (255, 0, 0), -1)

cv2.imshow('tomas', img)

cv2.waitKey(0)

SIFT

Scale-Invariant Feature Transform  与缩放无关的特征转换

提出:Harris角点检测,当图像缩放后,原来的角点可能会消失如下图所示。SIFT就是为了解决这一问题。

OpenCV_09特征检测_第4张图片

检测的步骤

1.创建SIFT对象  sift = cv2.SIFT_create()

2.进行检测  kp = sift.detect(img , mask) # mask感兴趣区域,默认None

3.绘制关键点  drawKeypoints(gray , kp , img) # img是要绘制的图片

OpenCV_09特征检测_第5张图片  

import cv2
import numpy as np

img = cv2.imread('../img/ex03.jpg')
# 灰度化才能进行角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT_create()
kp = sift.detect(gray)
cv2.drawKeypoints(gray,kp,img)

cv2.imshow('SIFT', img)

cv2.waitKey(0)

计算关键点和描述子

关键点:位置、大小、方向

关键点描述子:记录了关键点周围对其有贡献的像素点的一组向量值,不受仿射变换、光照变换等影响。

同时计算关键点kp和描述子des:

kp , des = sift.detectAndCompute(img,mask...)

mask : 指明对img的哪个区域进行计算

其作用是进行特征匹配

OpenCV_09特征检测_第6张图片

import cv2
import numpy as np

img = cv2.imread('../img/ex03.jpg')
# 灰度化才能进行角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT_create()
# 计算关键点和描述子
kp,des = sift.detectAndCompute(gray,None)
print(des)

cv2.drawKeypoints(gray,kp,img)

cv2.imshow('SIFT', img)

cv2.waitKey(0)

SURF

Speeded-Up Robust Features

提出:SIFT最大的问题是速度慢,所以有了该算法 

1.创建对象 surf = cv2.xfeatures2d.SURF_create()

2.计算关键点和描述子  kp,des = surf.detectAndCompute(img , mask)

检测结果同SIFT,检测到的角点会少一点。

ORB

Oriented FAST and Rotated BRIEF

优势:可以做到实时检测

orb = cv2.ORB_create()

kp,des = orb.detectAndCompute(gray,None)

OpenCV_09特征检测_第7张图片

可以看到检测到的特征点非常少,这是因为实时性提高了,计算量减少了,只留下关键点 

import cv2
import numpy as np

img = cv2.imread('../img/ex03.jpg')
# 灰度化才能进行角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

orb = cv2.ORB_create()
# 计算关键点和描述子
kp,des = orb.detectAndCompute(gray,None)
print(des)

cv2.drawKeypoints(gray,kp,img)

cv2.imshow('ORB', img)

cv2.waitKey(0)

你可能感兴趣的:(计算机视觉,opencv,计算机视觉,人工智能)