opencv 特征点匹配坐标提取

特征点通过: 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)

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员进化不脱发!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值