笔记和用法都在代码注释中:
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# -----------------------角点检测-------------: Harris 角点检测 【可以快速检测出 角点 , 就是 角
# cv.cornerHarris(img,blockSize=,ksize=,k=)
# img : 数据类型 :为 float 32 的入图像
# blockSize : 角点检测中指定区域的大小
# ksize : Sobel 求导中使用的 窗口大小
# k : 取值 参数 为 : 【0,04,0.06】
# img = cv.imread('666.jpg')
# img = cv.resize(img,(500,500))
# print('666.jpg:',img.shape)
# gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# dst = cv.cornerHarris(gray,2,3,0.04) # 每一个点都算完了 【计算图像的角点】
# print('dst.shape:',dst.shape)
#
# # ----------参数越小, 点越多 , 自己设置感受 !!!
# img[dst>0.1*dst.max()] = [0,0,255] # 如果变化程度大于了 0。01 , 那么就可能是一个角点, 就会画出来 【画笔为红色(0,0,255)】
# cv.imshow('dst',img)
# cv.waitKey(0)
# cv.destroyAllWindows()
# -----------------------图像尺度空间-------------:让计算机在 清晰和模糊;远和近 的情况下都可以识别
#尺度空间的获取 : 通常 使用高斯模糊 来实现 !!!
# --------------------------------------------------------- SIFT 函数 [关键点绘制]
# img = cv.imread('666.jpg')
# img = cv.resize(img,(500,500))
# gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#
# sift = cv.xfeatures2d.SIFT_create() # 现在用不了了 !!【 受专利保护 !!!】
# kp = sift.detect(gray,None)
#
# img = cv.drawKeypoints(gray,kp,img) # 绘制关键点 !!!
# cv.imshow('Keypoints',img)
# cv.waitKey(0)
# cv.destroyAllWindows()
#
# kp,des = sift.compute(gray,kp) # 第一个 :关键点的 个数
# print(np.array(kp).shape)
#
# print(des.shape) # [默认长度 :128维]
# ------------------------------------------------------Brute - Force 蛮力匹配
img1 = cv.imread('666.jpg',0)
img2 = cv.imread('666.jpg',0)
def cv_show(name,img):
cv.imshow()
cv.waitKey(0)
cv.destroyAllWindows()
sift = cv.xfeature2d.SIFT_create() # SIFT 函数 [关键点绘制] [特征向量计算出来]
kp1,des1 = sift.detectAndCompute(img1,None) # 比较 距离
kp2,des2 = sift.detectAndCompute(img2,None)
bf = cv.BFMatcher(crossCheck=True) # 进行蛮力匹配
# --------------- 1对 1 的匹配
matches = bf.match(des1,des2)
matches = sorted(matches,key=lambda x: x.distance)
img3 = cv.drawMatches(img1,kp1,img2,kp2,matches[:10],None) # 将两个图像 (对应的) 的关键点 进行连在一起
cv_show('img3',img3)
# 全景图像 : 就是很多图像 组成的 ————就是拼接起来的 !! 【就是需要 关键点拼接 !!】
# ------------------------------------- k对 最佳匹配
bf = cv.BFMatcher()
matches = bf.knnMatch(des1,des2,k=2) # 不用 1对1 ,现在是2对 2
good = []
for m,n in matches:
if m.distance<0.75*n.distance:
good.append([m])
img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
cv_show('img3',img3)