pyautogui图像匹配
2022-01-25 本文已影响0人
jinjin1009
问题:
采用locateCenterOnScreen 和locateOnScreen这两种方法进行图像识别时,经常出现返回为None,识别不出来对应图片的情况,识别效果不够理想
解决办法:
针对上述问题,考虑基于opencv-python的模版匹配算法进行识图
这个模版匹配算法的原理是,从一张大的背景图中,找到一张你想要的小图
for specific correlation methods only, for TM_SQDIFF or TM_SQDIFF_NORMED the best match would be the minVal
注意:TM_SQDIFF 和 TM_SQDIFF_NORMED 两种算法使用最小值 minVal为最优
cv2.TM_CCOEFF / cv2.TM_CCOEFF_NORMED / cv2.TM_CCORR / cv2.TM_CCORR_NORMED
这四种算法使用最大值maxVal为最优
具体的代码
# 截取当前的屏幕,保存为big.png这张图片
pyautogui.screenshot('big.png')
# 读入当前屏幕的背景截图,0读入的是灰色图
gray = cv2.imread('big.png', 0)
# 读入要匹配查找的图片
img_template = cv2.imread(picture, 0)
# 要匹配查找的图片的宽和高
w, h = img_template.shape[::-1]
# 查找图片和背景截图的匹配操作
res = cv2.matchTemplate(gray, img_template, cv2.TM_SQDIFF)
# min_val为最小值
# max_val为最大值
# min_loc为一个数组,第一个值代表要匹配的图片左上角的横坐标
# min_loc为一个数组,第二个值代表要匹配的图片左上角的纵坐标
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
print(min_val, max_val, min_loc, max_loc)
left = min_loc[0]
top = min_loc[1]
top_left = min_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
# 相应匹配的中心位置为left+w/2和top+h/2
pyautogui.moveTo(left + w / 2, top + h / 2)
pyautogui.click(left + w / 2, top + h / 2)
识别的图片可以用红线框出来让你看到识别的位置
# 框出对应识别出来的图片
# 读入当前屏幕的背景截图,1代表彩色图
color = cv2.imread('big.png', 1)
#画出矩形框
cv2.rectangle(color, top_left, bottom_right, (0, 0, 255), 2)
#关闭坐标
plt.axis('off')
#颜色转换
color = cv2.cvtColor(color, cv2.COLOR_BGR2RGB)
plt.subplot(121), plt.imshow(res, cmap='gray')
plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(color)
plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
plt.show()
参考:https://blog.csdn.net/qq_43006346/article/details/116353126