screen_vnc = vncutil.get_screenshot(client, 6011) # 转换为OpenCV格式 screenshot_cv = cv2.cvtColor(np.array(screen_vnc), cv2.COLOR_RGB2BGR) target_image_cv = cv2.cvtColor(np.array(target_img), cv2.COLOR_RGB2BGR) # 使用模板匹配查找图片 result = cv2.matchTemplate(screenshot_cv, target_image_cv, cv2.TM_CCOEFF_NORMED) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) logger.info("最大匹配值为:"+str(max_val)) 获取到匹配图片所在位置的中间点屏幕坐标
你的代码中使用了 OpenCV 的模板匹配来查找目标图片在屏幕截图中的位置。在匹配过程中,max_loc
变量包含了匹配位置的左上角坐标。如果你想获取匹配图片所在位置的中间点屏幕坐标,你可以根据匹配图片的宽度和高度计算得到。
以下是一个简单的示例:
# 获取匹配图片的宽度和高度
target_width, target_height = target_image_cv.shape[1], target_image_cv.shape[0]
# 计算匹配图片中心点在屏幕上的坐标
center_x = int(max_loc[0] + target_width / 2)
center_y = int(max_loc[1] + target_height / 2)
logger.info("匹配图片中心点坐标:" + str((center_x, center_y)))
上述代码假设 target_image_cv
是你要匹配的目标图片在 OpenCV 格式下的表示。你可以将这段代码添加到你的现有代码中,以获取匹配图片中心点的屏幕坐标。
bmp图片很小,我该如何获取
如果你的 BMP 图片很小,而且在屏幕截图中可能很难被匹配到,可以考虑采取以下一些方法:
-
调整匹配算法参数: 在 OpenCV 的
cv2.matchTemplate
中,可以通过调整threshold
参数来设置匹配的阈值。增加或减小阈值可能会影响匹配的结果。result = cv2.matchTemplate(screenshot_cv, target_image_cv, cv2.TM_CCOEFF_NORMED) threshold = 0.8 # 根据实际情况调整阈值 loc = np.where(result >= threshold)
随着阈值的增加,匹配到的位置数量可能会减少。你可以根据需要调整阈值,使匹配结果更符合你的预期。
-
尝试不同的匹配算法: OpenCV 提供了不同的匹配算法,如
cv2.TM_SQDIFF
、cv2.TM_SQDIFF_NORMED
、cv2.TM_CCORR
、cv2.TM_CCORR_NORMED
等。你可以尝试不同的算法,看看是否有更好的匹配效果。 -
尝试其他图像处理技术: 如果匹配的图片很小,可以考虑使用图像处理技术进行预处理,例如图像缩放、边缘增强等,以增加匹配的准确性。
-
调整目标图片: 确保你的目标图片在屏幕截图中有足够的特征,避免图片过于简单或过于复杂。你可以尝试在目标图片中增加一些特征,以提高匹配的准确性。
根据你的具体情况,可以尝试这些方法来提高匹配效果。
使用cv2.matchTemplate进行匹配的时候,我在不同分辨率电脑上进行截图,如何更好的识别
处理不同分辨率的屏幕截图时,你可能需要考虑一些适应性的方法,以确保匹配效果在不同分辨率下都能较好地工作。以下是一些建议:
-
缩放目标图片: 将目标图片根据当前屏幕的分辨率进行缩放。你可以使用 OpenCV 的
cv2.resize
函数来调整目标图片的大小。# 根据屏幕分辨率调整目标图片大小 target_image_resized = cv2.resize(target_image_cv, (width, height)) # 使用缩放后的目标图片进行匹配 result = cv2.matchTemplate(screenshot_cv, target_image_resized, cv2.TM_CCOEFF_NORMED)
-
使用多尺度匹配: 在不同分辨率下,可以尝试使用多个尺度的目标图片进行匹配。逐步改变目标图片的大小,然后在每个尺度下进行匹配。这可以通过循环调整目标图片的大小来实现。
for scale in [0.8, 1.0, 1.2]: target_image_resized = cv2.resize(target_image_cv, (int(width * scale), int(height * scale))) result = cv2.matchTemplate(screenshot_cv, target_image_resized, cv2.TM_CCOEFF_NORMED) # 处理匹配结果...
-
使用特征点匹配: 如果目标图片中有一些独特的特征点,可以考虑使用特征点匹配方法,如 SIFT 或 ORB。这些方法对于不同分辨率下的图像具有一定的适应性。
# 使用ORB特征点匹配 orb = cv2.ORB_create() kp1, des1 = orb.detectAndCompute(target_image_cv, None) kp2, des2 = orb.detectAndCompute(screenshot_cv, None) bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) matches = bf.match(des1, des2) matches = sorted(matches, key=lambda x: x.distance) # 处理匹配结果...
-
考虑使用模板区域的 ROI 匹配: 在不同分辨率下,可以通过在截图中选择感兴趣区域(ROI)来匹配目标图片。这样可以减少匹配的搜索空间。
# 根据分辨率调整 ROI 的坐标 roi = screenshot_cv[y:y+height, x:x+width] # 使用 ROI 进行匹配 result = cv2.matchTemplate(roi, target_image_cv, cv2.TM_CCOEFF_NORMED)
这些方法可以根据具体情况进行组合和调整,以适应不同分辨率的屏幕截图。