opencv-python进行sift匹配之后输出匹配点的坐标

查阅资料得在经过sift匹配之后,特征点类如下所示

class KeyPoint

{            Point2f  pt;  //坐标

             float  size; //特征点邻域直径

             float  angle; //特征点的方向,值为[零,三百六十),负值表示不使用

             float  response;

             int  octave; //特征点所在的图像金字塔的组

             int  class_id; //用于聚类的id

}

opencv-python中也一样

#coding=utf-8
'''
@project : binocular_vision
@author  : Hoodie_Willi
#@description: $输出sift匹配后,匹配点的坐标
#@time   : 2019-05-28 10:25:36
'''
import numpy as np
import cv2
sift = cv2.xfeatures2d.SIFT_create()
img1 = cv2.imread("./img/l/left.jpg", cv2.COLOR_BGR2GRAY)
img2 = cv2.imread("./img/r/right.jpg", cv2.COLOR_BGR2GRAY)
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
bf =cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

# ## Create flann matcher
# FLANN_INDEX_KDTREE = 1 # bug: flann enums are missing
# flann_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
# #matcher = cv2.FlannBasedMatcher_create()
# matcher = cv2.FlannBasedMatcher(flann_params, {})

## Ratio test
print(len(matches))
matchesMask = [[0, 0] for i in range(len(matches))]
for i, (m1, m2) in enumerate(matches):
    if m1.distance < 0.7 * m2.distance:# 两个特征向量之间的欧氏距离,越小表明匹配度越高。
        matchesMask[i] = [1, 0]
        pt1 = kp1[m1.queryIdx].pt  # trainIdx    是匹配之后所对应关键点的序号,第一个载入图片的匹配关键点序号
        pt2 = kp2[m1.trainIdx].pt  # queryIdx  是匹配之后所对应关键点的序号,第二个载入图片的匹配关键点序号
        # print(kpts1)
        print(i, pt1, pt2)
        if i % 5 ==0:
            cv2.circle(img1, (int(pt1[0]),int(pt1[1])), 5, (255,0,255), -1)
            cv2.circle(img2, (int(pt2[0]),int(pt2[1])), 5, (255,0,255), -1)

# 匹配点为蓝点, 坏点为红点
draw_params = dict(matchColor = (255, 0,0),
        singlePointColor = (0,0,255),
        matchesMask = matchesMask,
        flags = 0)

res = cv2.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **draw_params)
cv2.imshow("Result", res)
cv2.waitKey(0)
cv2.destroyAllWindows()

匹配结果如图:

坐标如图所示

以下是使用OpenCV-Python实现图像拼接的示例代码: ```python import cv2 import numpy as np # 加载图像 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') # 转换为灰度图像 gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # 创建SIFT对象 sift = cv2.xfeatures2d.SIFT_create() # 计算关键和描述符 kp1, des1 = sift.detectAndCompute(gray1, None) kp2, des2 = sift.detectAndCompute(gray2, None) # 创建FLANN匹配器 index_params = dict(algorithm=0, trees=5) search_params = dict(checks=50) flann = cv2.FlannBasedMatcher(index_params, search_params) # 匹配关键 matches = flann.knnMatch(des1, des2, k=2) # 选择最佳匹配 good_matches = [] for m, n in matches: if m.distance < 0.7 * n.distance: good_matches.append(m) # 获取匹配坐标 src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2) dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2) # 计算变换矩阵 M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) # 创建拼接图像 result = cv2.warpPerspective(img1, M, (img1.shape[1] + img2.shape[1], img1.shape[0])) result[0:img2.shape[0], 0:img2.shape[1]] = img2 # 显示拼接结果 cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段代码使用SIFT算法检测两张图像中的关键,并使用FLANN匹配器对关键进行匹配。然后,使用RANSAC算法计算变换矩阵,将第一张图像变换到与第二张图像相同的坐标系中。最后,将两张图像拼接起来以创建新的图像。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值