sift算法与surforb算法进行比较的代码详细一点
以下是使用OpenCV实现SIFT、SURF和ORB算法的代码,包括图像读取、特征提取和匹配等步骤:
import cv2
import numpy as np
# 读取图像
img1 = cv2.imread('img1.jpg')
img2 = cv2.imread('img2.jpg')
# 创建SIFT、SURF和ORB对象
sift = cv2.xfeatures2d.SIFT_create()
surf = cv2.xfeatures2d.SURF_create()
orb = cv2.ORB_create()
# 提取特征点和描述符
kp1_sift, des1_sift = sift.detectAndCompute(img1, None)
kp2_sift, des2_sift = sift.detectAndCompute(img2, None)
kp1_surf, des1_surf = surf.detectAndCompute(img1, None)
kp2_surf, des2_surf = surf.detectAndCompute(img2, None)
kp1_orb, des1_orb = orb.detectAndCompute(img1, None)
kp2_orb, des2_orb = orb.detectAndCompute(img2, None)
# 创建匹配器对象
bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True)
# 匹配特征点
matches_sift = bf.match(des1_sift, des2_sift)
matches_surf = bf.match(des1_surf, des2_surf)
matches_orb = bf.match(des1_orb, des2_orb)
# 排序并绘制匹配结果
matches_sift = sorted(matches_sift, key=lambda x: x.distance)
matches_surf = sorted(matches_surf, key=lambda x: x.distance)
matches_orb = sorted(matches_orb, key=lambda x: x.distance)
img_sift = cv2.drawMatches(img1, kp1_sift, img2, kp2_sift, matches_sift[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
img_surf = cv2.drawMatches(img1, kp1_surf, img2, kp2_surf, matches_surf[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
img_orb = cv2.drawMatches(img1, kp1_orb, img2, kp2_orb, matches_orb[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
# 显示匹配结果
cv2.imshow('SIFT', img_sift)
cv2.imshow('SURF', img_surf)
cv2.imshow('ORB', img_orb)
cv2.waitKey()
在上述代码中,首先读取了两张待匹配的图像img1和img2。然后创建了SIFT、SURF和ORB对象,使用detectAndCompute()方法提取了图像的特征点和描述符。接着,创建了匹配器对象bf,并使用match()方法对两张图像的特征点进行匹配。最后,使用drawMatches()方法将匹配结果绘制出来,并在窗口中显示出来。
值得注意的是,在创建SIFT和SURF对象时,需要使用xfeatures2d模块中的SIFT_create()和SURF_create()方法,而不是直接使用cv2模块中的方法。在使用ORB算法时,则可以直接使用cv2模块中的ORB_create()方法。另外,在匹配特征点时,需要使用cv2.BFMatcher对象,并将crossCheck参数设置为True,以使用双向匹配策略。最后,使用cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS标志可以绘制出所有匹配的特征点,而不仅仅是匹配对之间的连线
原文地址: https://www.cveoy.top/t/topic/e9tM 著作权归作者所有。请勿转载和采集!