OpenCV Python – 使用SIFT算法实现两张图片的特征匹配
1.要实现在大图中找到任意旋转、缩放等情况下的小图位置,可以使用特征匹配算法,如 SIFT (尺度不变特征变换) 或 SURF (加速稳健特征)。这些算法可以在不同尺度和旋转情况下寻找匹配的特征点
import cv2
import numpy as np
def find_template(template_path, image_path):
# 加载图像
template = cv2.imread(template_path, 0)
image = cv2.imread(image_path, 0)
# 初始化 SIFT 探测器
sift = cv2.xfeatures2d.SIFT_create()
# 在模板和大图中检测特征点和特征描述符
keypoints1, descriptors1 = sift.detectAndCompute(template, None)
keypoints2, descriptors2 = sift.detectAndCompute(image, None)
# 初始化暴力匹配器
matcher = cv2.DescriptorMatcher_create(cv2.DescriptorMatcher_BRUTEFORCE)
# 寻找最佳匹配
matches = matcher.match(descriptors1, descriptors2)
# 根据匹配度排序
matches = sorted(matches, key=lambda x: x.distance)
# 提取匹配结果
num_good_matches = int(len(matches) * 0.15) # 根据匹配结果数自行调整,这里取前 15% 的匹配结果
good_matches = matches[:num_good_matches]
# 提取匹配结果的对应关系
src_pts = np.float32([keypoints1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
dst_pts = np.float32([keypoints2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)
# 计算透视变换矩阵
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
# 获取模板图像的宽高
h, w = template.shape
# 在大图中查找模板位置
matches_mask = mask.ravel().tolist()
if sum(matches_mask) > 10:
pts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2)
dst = cv2.perspectiveTransform(pts, M)
return dst.reshape(4, 2)
else:
return None
# 示例用法
template_path = 'path_to_template_image.png'
image_path = 'path_to_large_image.png'
result = find_template(template_path, image_path)
if result is not None:
print("找到了模板图像的位置:")
for pt in result:
print("坐标:", pt)
else:
print("未找到模板图像")
2.我们使用了 SIFT 算法检测和匹配特征点,然后使用 RANSAC 算法计算透视变换矩阵,从而得到模板图像在大图中的位置。根据你的需求,你可以根据实际情况调整代码中的阈值以及匹配结果的筛选条件。文章来源:https://www.toymoban.com/news/detail-734822.html
请注意,使用 SIFT 算法需要安装额外的 OpenCV 扩展库,可以通过 pip 安装:pip install opencv-contrib-python。如果你使用的是不带 SIFT 的 OpenCV 版本,你可以尝试 SURF 算法,或者使用其他特征提取和匹配算法来适应不同的图像变换情况。文章来源地址https://www.toymoban.com/news/detail-734822.html
到了这里,关于OpenCV Python – 使用SIFT算法实现两张图片的特征匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!