基于OpenCV实现掩模白色区域识别及鼠标自动点击的方案咨询
实现方案
你可以通过OpenCV的轮廓查找功能定位白色连通区域,搭配PyAutoGUI实现鼠标点击,具体实现如下:
前置依赖安装
pip install pyautogui
修改后完整代码
import time import cv2 import numpy as np import mss import pyautogui # 点击冷却时间,避免重复点击 CLICK_COOLDOWN = 1 last_click_time = 0 with mss.mss() as sct: monitor = {"top": 1, "left": 1, "width": 250, "height": 250} lower=np.array([2,97,154]) upper=np.array([4,210,225 ]) # hero # 形态学操作内核,用于降噪 kernel = np.ones((3,3), np.uint8) while "Screen capturing": img = np.array(sct.grab(monitor)) hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) mask = cv2.inRange(hsv, lower, upper) # 第一步:mask降噪,去除小噪点 mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=2) # 第二步:查找所有白色连通区域轮廓 contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if contours: # 第三步:过滤面积过小的轮廓,可根据实际场景调整阈值 valid_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > 50] if valid_contours: # 取面积最大的目标区域 target_cnt = max(valid_contours, key=cv2.contourArea) # 计算区域中心坐标 M = cv2.moments(target_cnt) if M["m00"] != 0: cx = int(M["m10"] / M["m00"]) cy = int(M["m01"] / M["m00"]) # 转换为屏幕绝对坐标 screen_x = cx + monitor["left"] screen_y = cy + monitor["top"] # 冷却时间到后触发点击 current_time = time.time() if current_time - last_click_time > CLICK_COOLDOWN: pyautogui.click(screen_x, screen_y) last_click_time = current_time print(f"触发点击,坐标:({screen_x}, {screen_y})") cv2.imshow("Maskelenmis", mask) # 按q键退出 if cv2.waitKey(25) & 0xFF == ord("q"): cv2.destroyAllWindows() break
关键参数调整说明
- 面积阈值:代码里
cv2.contourArea(cnt) > 50的数值50可以根据目标区域实际大小调整,避免小噪点触发误点击 - 冷却时间:
CLICK_COOLDOWN可根据需求调整点击间隔,单位为秒 - 形态学内核大小:如果噪点较多可以把
np.ones((3,3))改成np.ones((5,5))增强降噪效果
内容的提问来源于stack exchange,提问作者Beat By Venom
相关产品推荐
相关产品推荐

