OpenCV-Python ORB特征匹配(实践篇)

#对象查找
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread(r'C:\Users\Administrator\Desktop\project\\nail_cut.png',cv2.IMREAD_GRAYSCALE)#打开灰度图像
img2=cv2.imread(r'C:\Users\Administrator\Desktop\project\\nail_2.png',cv2.IMREAD_GRAYSCALE)#打开灰度图像

orb=cv2.ORB_create()#创建ORB检测器
kp1,des1=orb.detectAndCompute(img1,None)#检测关键点和计算描述符
kp2,des2=orb.detectAndCompute(img2,None)#检测关键点和计算描述符
bf=cv2.BFMatcher_create(cv2.NORM_HAMMING,crossCheck=True)#创建匹配器
ms=bf.match(des1,des2)#执行特征匹配
ms=sorted(ms,key=lambda x:x.distance)#按距离排序
matchesMask=None
if len(ms)>10:#在有足够数量的匹配结果后,才计算查询在训练图像中的位置
    #计算查询图像匹配结果的坐标
    querypts=np.float32([kp1[m.queryIdx].pt for m in ms]).reshape(-1,1,2)
    #计算训练图像匹配结果的坐标
    trainpts = np.float32([kp1[m.queryIdx].pt for m in ms]).reshape(-1, 1, 2)
    #执行查询图像和训练图像的透视变换
    retv,mask=cv2.findHomography(querypts,trainpts,cv2.RANSAC)
    #计算最佳匹配结果的掩模,用于绘制匹配结果
    matchesMask=mask.ravel().tolist()
    h,w=img1.shape
    pts=np.float32([[0,0],[0,h-1],[w-1,h-1],[w-1,0]]).reshape(-1,1,2)
    #执行向量的透视矩阵变换,获得查询图像在图像中的位置
    dst=cv2.perspectiveTransform(pts,retv)
    #用白色矩形在训练图像中绘制出查询图像的范围
    img2=cv2.polylines(img2,[np.int32(dst)],True,(255,255,255),5)
img3=cv2.drawMatches(img1,kp1,img2,kp2,ms,None,
                         matchColor=(0,255,0),
                         singlePointColor=None,
                         matchesMask=matchesMask,
                         flags=cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS)
plt.imshow(img3)
plt.axis('off')
plt.show()

你可能感兴趣的:(opencv,python,python,opencv)