Python从数组提取单个整数变量及OpenCV获取单图像坐标问题
提取OpenCV匹配结果中的单个坐标值
首先咱们先理清楚问题根源:np.where(res >= threshold)会返回所有匹配度超过阈值的坐标点集合,所以loc[0]是所有匹配点的y坐标数组,loc[1]是x坐标数组。如果只想拿到单个坐标值,可以按两种场景处理:
场景1:取第一个匹配到的坐标点
如果能确定至少有一个匹配结果,或者只需要第一个匹配点,直接提取数组的第一个元素即可:
def getImageXY(): im = pyautogui.screenshot() im.save(filePathSrc) img_rgb = cv2.imread(filePathSrc) template = cv2.imread(filePathToFind) res = cv2.matchTemplate(img_rgb, template, cv2.TM_CCOEFF_NORMED) threshold = .8 loc = np.where(res >= threshold) # 先检查是否有匹配结果,避免索引报错 if len(loc[0]) > 0: # 提取第一个匹配点的x、y坐标 x = loc[1][0] y = loc[0][0] return x, y else: # 没有匹配到的情况,返回默认值或按需抛出异常 return None, None
场景2:取匹配度最高的坐标点(更推荐)
其实用cv2.minMaxLoc函数能更直接地解决问题——它会直接返回匹配结果中的最值及对应坐标(因为你用的是TM_CCOEFF_NORMED,值越大匹配度越高),不用处理数组就能拿到单个最优坐标:
def getImageXY(): im = pyautogui.screenshot() im.save(filePathSrc) img_rgb = cv2.imread(filePathSrc) template = cv2.imread(filePathToFind) res = cv2.matchTemplate(img_rgb, template, cv2.TM_CCOEFF_NORMED) # 获取匹配结果中的最值及对应坐标 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) threshold = .8 # 验证最佳匹配是否符合阈值要求 if max_val >= threshold: # max_loc本身就是(x, y)格式的坐标,直接拆分即可 x, y = max_loc return x, y else: return None, None
这里要注意:max_loc返回的顺序是**(x, y)**,刚好对应你需要的变量,比用np.where更简洁,还能确保拿到匹配度最高的那个点,不会因为多个匹配点混乱。
内容的提问来源于stack exchange,提问作者ziggy
相关产品推荐
相关产品推荐

