OpenCV Python – Verwenden Sie den SIFT-Algorithmus, um den Funktionsabgleich zweier Bilder zu erreichen

OpenCV Python – Verwenden Sie den SIFT-Algorithmus, um den Funktionsabgleich zweier Bilder zu erreichen

1. Um die Position eines kleinen Bildes in einem großen Bild unter willkürlicher Drehung, Skalierung usw. zu ermitteln, können Sie Feature-Matching-Algorithmen wie SIFT (Scale Invariant Feature Transform) oder SURF (Speed ​​​​Up Robust Features) verwenden. Diese Algorithmen können passende Merkmalspunkte in verschiedenen Maßstäben und Rotationen finden

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. Wir haben den SIFT-Algorithmus verwendet, um Merkmalspunkte zu erkennen und abzugleichen, und dann den RANSAC-Algorithmus verwendet, um die perspektivische Transformationsmatrix zu berechnen, um die Position des Vorlagenbilds im großen Bild zu erhalten. Je nach Bedarf können Sie den Schwellenwert im Code und die Filterbedingungen der Übereinstimmungsergebnisse entsprechend der tatsächlichen Situation anpassen.

Bitte beachten Sie, dass die Verwendung des SIFT-Algorithmus die Installation zusätzlicher OpenCV-Erweiterungsbibliotheken erfordert, die über pip installiert werden können: pip install opencv-contrib-python. Wenn Sie die OpenCV-Version ohne SIFT verwenden, können Sie den SURF-Algorithmus ausprobieren oder andere Merkmalsextraktions- und Matching-Algorithmen verwenden, um sich an verschiedene Bildtransformationssituationen anzupassen.

おすすめ

転載: blog.csdn.net/huage926/article/details/133707020