123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- # -*- coding: utf-8 -*-
- import pyautogui
- import random
- import time
- import numpy as np
- import cv2
- from PIL import Image
- import pyscreeze
- pyscreeze.USE_IMAGE_NOT_FOUND_EXCEPTION = False
- def color_string_to_rgb(color_string):
- r = int(color_string[0:2], 16)
- g = int(color_string[2:4], 16)
- b = int(color_string[4:6], 16)
- return (r, g, b)
- def savePic(screenshot, fileName):
- image = Image.frombytes('RGB', screenshot.size, screenshot.bgra, 'raw', 'BGRX')
- image.save(fileName) # 保存为PNG格式的图像文件
- def find_center_point(pointArr):
- min_distance = float('inf')
- center_point = None
- for point in pointArr:
- total_distance = 0
- for other_point in pointArr:
- distance = ((other_point[0] - point[0]) ** 2 + (other_point[1] - point[1]) ** 2) ** 0.5
- total_distance += distance
- if total_distance < min_distance:
- min_distance = total_distance
- center_point = point
- return center_point
- class pcacc_img:
- def __init__(specifically):
- random.seed()
-
- @staticmethod
- def find_maxColor_position(cur_region, colorArr): #(left, top, width, height)
- left = cur_region[0]
- top = cur_region[1]
- width = cur_region[2]
- height = cur_region[3]
- region = (left, top, width, height)
- # 目标颜色和容差值
-
- tolerance = 10 # 容差值
- # 在指定区域获取屏幕图像
- screenshotSrc = pyautogui.screenshot(region=region)
- print(region)
-
-
- screenshot = np.array(screenshotSrc)
- dstPointArr = []
- # 创建颜色范围的上下界
- for color_str in colorArr:
- target_color = color_string_to_rgb(color_str)
- lower_color = np.array(target_color) - tolerance
- upper_color = np.array(target_color) + tolerance
- # 在图像中查找匹配的像素
- mask = cv2.inRange(screenshot, lower_color, upper_color)
- # 显示 mask 图像
- #plt.imshow(mask, cmap='gray')
- #plt.show()
- points = np.transpose(np.where(mask > 0))
- if len(points) < 5:
- continue
- # 转换坐标到全局坐标系
- points[:, 0] += region[0]
- points[:, 1] += region[1]
- '''
- # 使用K-means聚类将匹配点分为不同的簇
- n_clusters = 5 # 簇的数量,可根据需要进行调整
- kmeans = KMeans(n_clusters=n_clusters)
- kmeans.fit(points)
- # 找到最大的簇
- max_cluster_label = np.argmax(np.bincount(kmeans.labels_))
- max_cluster_points = points[kmeans.labels_ == max_cluster_label]
- '''
- # 输出最集中的像素区域的位置
- for point in points:
- dstPointArr.append(point)
- if len(dstPointArr) > 0:
- return True, find_center_point(dstPointArr)
- else:
- return False, (-1, -1)
-
- @staticmethod
- def find_img_position(image_path):
- # 设置查找的置信度(confidence)阈值,范围从0到1,默认为0.999
- confidence_threshold = 0.85
- # 查找模糊图片在屏幕上的位置
- position = pyautogui.locateOnScreen(image_path, confidence=confidence_threshold)
- if position is not None:
- return True, position
- else:
- return False, None
-
- @staticmethod
- def choose_two_point_from_position(position):
- dst_x1 = random.randint(position.left, position.left + position.width)
- dst_y1 = random.randint(position.top, position.top + position.height)
- dst_x2 = random.randint(position.left, position.left + position.width)
- dst_y2 = random.randint(position.top, position.top + position.height)
- return (dst_x1, dst_y1), (dst_x2, dst_y2)
- @staticmethod
- def choose_one_point_from_position(position):
- dst_x1 = random.randint(position.left, position.left + position.width)
- dst_y1 = random.randint(position.top, position.top + position.height)
- return (dst_x1, dst_y1)
- @staticmethod
- def find_all_img(image_path):
- # 设置查找的置信度(confidence)阈值,范围从0到1,默认为0.999
- confidence_threshold = 0.95
- # 查找模糊图片在屏幕上的位置
- positions = pyautogui.locateAllOnScreen(image_path, confidence=confidence_threshold)
- if len(positions) == 0:
- return False, []
- return True, positions
-
- @staticmethod
- def find_img_cv(image_path, region=None):
- # 读取模板和屏幕截图
- confidence_threshold = 0.95
- template = cv2.imread(image_path, cv2.IMREAD_COLOR)
- screenshot = cv2.cvtColor(np.array(pyautogui.screenshot(region=region)), cv2.COLOR_RGB2BGR)
-
- # 模板匹配
- result = cv2.matchTemplate(screenshot, template, cv2.TM_CCOEFF_NORMED)
- _, max_val, _, max_loc = cv2.minMaxLoc(result)
-
- if max_val > confidence_threshold: # 置信度阈值
- left, top = max_loc # 左上角坐标
- width, height = template.shape[1], template.shape[0] # 模板宽高
- #mid
- mid_left = int(left + width / 4)
- mid_right = int(left + width / 4 * 3)
- mid_top = int(top + height / 4)
- mid_bottom = int(top + height / 4 * 3)
- #want_position
- want_x = random.randint(mid_left, mid_right)
- want_y = random.randint(mid_top, mid_bottom)
- #dst_position
- dst_x = random.randint(int(want_x - width / 3), int(want_x + width / 3))
- dst_y = random.randint(int(want_y - height / 3), int(want_y + height / 3))
-
- print(f"{image_path}:({dst_x}, {dst_y})")
- return True, (dst_x, dst_y)
- else:
- print(f"{image_path} cv图片未找到")
- return False, (-1, -1)
- @staticmethod
- def find_img(image_path):
- # 设置查找的置信度(confidence)阈值,范围从0到1,默认为0.999
- confidence_threshold = 0.92
- # 查找模糊图片在屏幕上的位置
- position = pyautogui.locateOnScreen(image_path, confidence=confidence_threshold)
- if position is not None:
- # 图片找到了,获取图片的中心点坐标
- #mid
- mid_left = int(position.left + position.width / 4)
- mid_right = int(position.left + position.width / 4 * 3)
- mid_top = int(position.top + position.height / 4)
- mid_bottom = int(position.top + position.height / 4 * 3)
- #want_position
- want_x = random.randint(mid_left, mid_right)
- want_y = random.randint(mid_top, mid_bottom)
- #dst_position
- dst_x = random.randint(int(want_x - position.width / 3), int(want_x + position.width / 3))
- dst_y = random.randint(int(want_y - position.height / 3), int(want_y + position.height / 3))
-
- print(f"{image_path}:({dst_x}, {dst_y})")
- return True, (dst_x, dst_y)
- else:
- print(f"{image_path}图片未找到")
- return False, (-1, -1)
- @staticmethod
- def find_imgArr(imgArr):
- for cur_img in imgArr:
- ret, pos = pcacc_img.find_img(cur_img)
- if ret:
- return ret, pos
- return False, None
-
- @staticmethod
- def find_imgArr_cv(imgArr):
- for cur_img in imgArr:
- ret, pos = pcacc_img.find_img_cv(cur_img)
- if ret:
- return ret, pos
- return False, None
- @staticmethod
- def find_imgs(images, is_cv=False):
- if is_cv:
- return pcacc_img.find_imgs_cv(images)
- else:
- if isinstance(images, str):
- return pcacc_img.find_img(images)
- elif isinstance(images, (list, tuple)):
- return pcacc_img.find_imgArr(images)
- else:
- raise ValueError("Invalid input type for 'images' parameter.")
-
- @staticmethod
- def find_imgs_cv(images):
- if isinstance(images, str):
- return pcacc_img.find_img_cv(images)
- elif isinstance(images, (list, tuple)):
- return pcacc_img.find_imgArr_cv(images)
- else:
- raise ValueError("Invalid input type for 'images' parameter.")
- @staticmethod
- def find_all_image_locations(image):
- confidence_threshold = 0.90
- # 查找所有符合条件的图片位置
- locations = pyautogui.locateAllOnScreen(image, confidence=confidence_threshold)
- # 将位置信息保存到列表中
- image_locations = []
- for location in locations:
- # 获取位置信息的左上角坐标和宽高
- x, y, width, height = location
- # 将位置信息添加到列表中
- image_locations.append((x, y, width, height))
- return image_locations
- @staticmethod
- def find_img_in_area(image,region=None):
- confidence_threshold = 0.85
- location = pyautogui.locateOnScreen(image,region=region, confidence=confidence_threshold)
- if location is not None:
- return True
- return False
-
- if __name__ == '__main__':
- time.sleep(2)
- begin = time.time()
- pcacc_img.find_maxColor_position((200, 200, 800, 200), {'2EA043'})
- cost = time.time() - begin
- print("函数执行耗时:", cost, "秒")
|