OpenCV 角点检测和特征匹配:Python 示例代码

本示例演示如何使用 OpenCV 在 Python 中进行角点检测和特征匹配,并使用 SIFT 算法匹配两张图片的角点。

角点检测

import cv2
import numpy as np

img1 = cv2.imread('C:/Users/LENOVO/Desktop/1.png')
img4 = cv2.imread('C:/Users/LENOVO/Desktop/4.png')

gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray1 = np.float32(gray1)
gray4 = cv2.cvtColor(img4, cv2.COLOR_BGR2GRAY)
gray4 = np.float32(gray4)

# 输入图像必须是 float32,最后一个参数在 0.04 到 0.05
dst1 = cv2.cornerHarris(gray1, 2, 3, 0.04)
dst1 = cv2.dilate(dst1, None)
dst4 = cv2.cornerHarris(gray4, 2, 3, 0.04)
dst4 = cv2.dilate(dst4, None)

# Threshold for an optimal value, it may vary depending on the image.
img1[dst1 > 0.01 * dst1.max()] = [0, 0, 255]
cv2.imshow('dst1', img1)
img4[dst4 > 0.01 * dst4.max()] = [0, 0, 255]
cv2.imshow('dst4', img4)
if cv2.waitKey(0) == 27:
    cv2.destroyAllWindows()

特征匹配

import cv2
import numpy as np

img1 = cv2.imread('C:/Users/LENOVO/Desktop/1.png')
img4 = cv2.imread('C:/Users/LENOVO/Desktop/4.png')

gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray4 = cv2.cvtColor(img4, cv2.COLOR_BGR2GRAY)

# 创建 SIFT 对象
sift = cv2.xfeatures2d.SIFT_create()

# 检测关键点和描述符
kp1, des1 = sift.detectAndCompute(gray1, None)
kp4, des4 = sift.detectAndCompute(gray4, None)

# 创建暴力匹配器
bf = cv2.BFMatcher()

# 匹配关键点
matches = bf.knnMatch(des1, des4, k=2)

# 应用比例测试,筛选出最佳匹配
good = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good.append(m)

# 绘制匹配结果
img_matches = cv2.drawMatches(img1, kp1, img4, kp4, good, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv2.imshow('Matches', img_matches)
if cv2.waitKey(0) == 27:
    cv2.destroyAllWindows()

注意:

  • 此方法只能匹配单个角点,如果需要匹配多个角点,则需要进行循环匹配。
  • 由于 SIFT 算法是有专利保护的,可能需要在使用前进行相应的授权或使用其他算法。
OpenCV 角点检测和特征匹配:Python 示例代码

原文地址: https://www.cveoy.top/t/topic/km4B 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录