特征点通过: orb 找
匹配方式蛮力匹配: BFMatcher
匹配的模板图像: s.bmp
匹配的测试图像: b2.bmp
匹配特征点结果图片为:
(int(cnt[0]), int(cnt[1])) 就是得到的对应点的坐标
代码如下:
import numpy as np
import cv2
from matplotlib import pyplot as plt
img2 = cv2.imread('dot_template/s.bmp', 0)
img1 = cv2.imread('dot_template/b2.bmp', 0)
src_img = cv2.imread('dot_template/b2.bmp', 1)
match_num = 600
threshold = 1000
orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
# 根据距离排序
matches_list = sorted(matches, key=lambda x: x.distance)
#以下m_data为一个 cv2.DMatch对象
# m_data.queryIdx 代表特征模板(也就是这里的s.bmp)特征点的索引
# m_data.trainIdx 代表特征点在另一张图像(这里的b.bmp)中相匹配的特征点的索引
# m_data.distance 代表对应特征点之间的欧氏距离,越小表明匹配度越高
# m_data.imgIdx 代表进行匹配图像的索引,如已知一幅图像的sift描述子,与其他十幅图像的描述子进行匹配,找最相似的图像,则imgIdx此时就有用了。
#以下 为一个 cv2.KeyPoint 对象, pt返回坐标
#(int(cnt[0]), int(cnt[1])) 就是得到的对应点的坐标
for m_data in matches[:match_num]:
print(type(m_data))
if m_data.distance < threshold:
cnt = kp1[m_data.trainIdx].pt
cv2.circle(src_img, (int(cnt[0]), int(cnt[1])), 5, (0, 0, 255), -1)
cv2.imshow("result",src_img)
cv2.imwrite("res_b2.bmp", src_img )
cv2.waitKey(0)