希望有能力的朋友还是拿C++做。
本节讨论特征检测,主要是Harris,shi-tomasi,sift三种方法和对比,以及原理简介,还有关键点和描述子的概念介绍。
特征检测包括边缘检测,角检测,区域检测和脊检测。
import cv2
import numpy as np
img = cv2.imread('homework.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
dst = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)
#返回的东西叫做角点响应,每一个像素点都能计算出一个角点响应
#print(dst.shape)
#显示角点
#我们认为角点响应大于0.01倍的dst.max()就可以认为是角点了
#print(dst>(0.01 * dst.max()))
#print(img.shape)
img[(dst>(0.05 * dst.max()))] = [0,0,255]
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
maxCorners = 100
q1 = 0.01
minDistance = 10
img = cv2.imread('homework.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
corners = cv2.goodFeaturesToTrack(gray, maxCorners, q1, minDistance)
corners = np.int0(corners)
#Shi-Tomasi绘制角点
for i in corners:
x,y = i.ravel() #二维变一维
cv2.circle(img, (x,y), 3, (255,255,0), -1)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
希望在图片不同尺寸(图像金字塔),不同分辨率(高斯滤波)下,都能找到角点。
sift关键点检测原理说明
import cv2
import numpy as np
img = cv2.imread('homework.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
#创建sift对象
#注意:xfretures2d是opencv的扩展包中的内容,需要安装opencv扩展包:opencv-contrib-python
sift = cv2.xfeatures2d.SIFT_create()
#进行检测
kp = sift.detect(gray)
print(kp)
#绘制关键点
cv2.drawKeypoints(gray, kp, img)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
img = cv2.imread('homework.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
#创建sift对象
sift = cv2.xfeatures2d.SIFT_create()
#进行检测
kp = sift.detect(gray)
#检测关键点,并计算描述子
kp,des = sift.compute(img, kp)
#或者一步到位,一起检测,none是掩膜
#kp, des = sift.detectAndCompute(img, None)
#print(kp, des)
# #绘制关键点
cv2.drawKeypoints(gray, kp, img)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()