max_val, min_loc, max_loc = cv2.minMaxLoc(result) logger.info(“最大匹配值为:“+str(max_val)) 获取到匹配图片所在位置的中间

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 图片很小,而且在屏幕截图中可能很难被匹配到,可以考虑采取以下一些方法:

  1. 调整匹配算法参数: 在 OpenCV 的 cv2.matchTemplate 中,可以通过调整 threshold 参数来设置匹配的阈值。增加或减小阈值可能会影响匹配的结果。

     
    result = cv2.matchTemplate(screenshot_cv, target_image_cv, cv2.TM_CCOEFF_NORMED)
    threshold = 0.8  # 根据实际情况调整阈值
    loc = np.where(result >= threshold)
    

    随着阈值的增加,匹配到的位置数量可能会减少。你可以根据需要调整阈值,使匹配结果更符合你的预期。

  2. 尝试不同的匹配算法: OpenCV 提供了不同的匹配算法,如 cv2.TM_SQDIFFcv2.TM_SQDIFF_NORMEDcv2.TM_CCORRcv2.TM_CCORR_NORMED 等。你可以尝试不同的算法,看看是否有更好的匹配效果。

  3. 尝试其他图像处理技术: 如果匹配的图片很小,可以考虑使用图像处理技术进行预处理,例如图像缩放、边缘增强等,以增加匹配的准确性。

  4. 调整目标图片: 确保你的目标图片在屏幕截图中有足够的特征,避免图片过于简单或过于复杂。你可以尝试在目标图片中增加一些特征,以提高匹配的准确性。

根据你的具体情况,可以尝试这些方法来提高匹配效果。

使用cv2.matchTemplate进行匹配的时候,我在不同分辨率电脑上进行截图,如何更好的识别

处理不同分辨率的屏幕截图时,你可能需要考虑一些适应性的方法,以确保匹配效果在不同分辨率下都能较好地工作。以下是一些建议:

  1. 缩放目标图片: 将目标图片根据当前屏幕的分辨率进行缩放。你可以使用 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)
    

  2. 使用多尺度匹配: 在不同分辨率下,可以尝试使用多个尺度的目标图片进行匹配。逐步改变目标图片的大小,然后在每个尺度下进行匹配。这可以通过循环调整目标图片的大小来实现。

    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)
        # 处理匹配结果...
    

  3. 使用特征点匹配: 如果目标图片中有一些独特的特征点,可以考虑使用特征点匹配方法,如 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)
    
    # 处理匹配结果...
    

  4. 考虑使用模板区域的 ROI 匹配: 在不同分辨率下,可以通过在截图中选择感兴趣区域(ROI)来匹配目标图片。这样可以减少匹配的搜索空间。

    # 根据分辨率调整 ROI 的坐标
    roi = screenshot_cv[y:y+height, x:x+width]
    
    # 使用 ROI 进行匹配
    result = cv2.matchTemplate(roi, target_image_cv, cv2.TM_CCOEFF_NORMED)
    

这些方法可以根据具体情况进行组合和调整,以适应不同分辨率的屏幕截图。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值