尝试对以下给定图像及其模板应用特征匹配。我想匹配给定图像中的模板,并在匹配的对象周围绘制方框。这些只是示例图像,我还有更多不同分辨率的图像,因此无法使用模板匹配。以下是代码。
import cv2
import numpy as np
# Load images
img1 = cv2.imread('C:/Users/Autobobcat/Desktop/Candy- crush.23.jpg', cv2.IMREAD_COLOR) # Query image
img2 = cv2.imread('C:/Users/Autobobcat/Desktop/blueVertical.png', cv2.IMREAD_COLOR) # Training image
# Convert images to grayscale
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# Create SIFT detector
sift = cv2.SIFT_create()
# Find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(gray1, None)
kp2, des2 = sift.detectAndCompute(gray2, None)
# Create BFMatcher object with default parameters
bf = cv2.BFMatcher()
# Match descriptors using KNN
matches = bf.knnMatch(des1, des2, k=2)
# Apply ratio test with a more lenient threshold
good_matches = []
for m, n in matches:
if m.distance < 0.3 * n.distance: # Adjusted ratio test
good_matches.append(m)
# Sort matches by distance
good_matches = sorted(good_matches, key=lambda x: x.distance)
# Draw matches
img_matches = cv2.drawMatches(img1, kp1, img2, kp2,
good_matches[:50], None,
flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
# Define target screen size
target_width = 1280
target_height = 720
# Calculate the aspect ratio of the image
(h, w) = img_matches.shape[:2]
aspect_ratio = w / h
# Determine the new size keeping the aspect ratio
if w > target_width or h > target_height:
if aspect_ratio > 1: # Image is wider than tall
new_width = target_width
new_height = int(target_width / aspect_ratio)
else: # Image is taller than wide
new_height = target_height
new_width = int(target_height * aspect_ratio)
else:
new_width, new_height = w, h
dim = (new_width, new_height)
# Resize image
resized_img_matches = cv2.resize(img_matches, dim,
interpolation=cv2.INTER_AREA)
# Display the result
cv2.imshow('Feature Matching', resized_img_matches)
cv2.waitKey(0)
cv2.destroyAllWindows()
我想到了三种方法:
1. 例如,如果您正在处理多个包含少量谜题的游戏,则可以写下每个谜题的一个可区分的 RGB 值。 例如,对于黄色块:
您可以选择一个值:
如果你在每场比赛中有几个不同的方块,这不会花费太多时间。写下值后,您可以检查每个图像以查看它们是否包含每种书写颜色。当然,这只会为您提供特定像素的位置。考虑一下块的情况:
这里有几种不同的颜色,但这是一个完全不同的块。您可以转换为 HSV 颜色空间:HSV 颜色空间, 并使用色相通道。假设例如黄色可以指定为色调通道中的某个范围的值,对图像进行阈值处理,以分别为块的每个写入颜色获得二进制图像。在二值图像上,使用函数
cv2.connectedComponents
- 您将获得块的轮廓。例如,可以通过观察多彩块上特定颜色的区域比其他拼图上的小许多倍来处理多彩块的情况。
2. 然而,如果您正在处理一些不寻常模式的块,则上述方法将过于复杂且费力。然后我建议使用特征匹配:https://docs.opencv.org/4.x/dc/dc3/tutorial_py_matcher.html 如果您使用此方法,图像尺寸的差异应该不是问题。
3. 您可以找到一个现成的图像分割模型,最好是经过类似性质的图像训练的模型,并对其进行微调。为此,您应该需要相当多,也许几十个(例如,取决于包含不同外观对象的游戏数量)。您必须手动标记特定谜题的区域 - 有现成的软件可以实现此目的,例如 LabelMe - 并使用它们来微调模型。