鱼C论坛

 找回密码
 立即注册
查看: 153|回复: 21

关于图片识别

[复制链接]
发表于 2024-6-3 09:47:16 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一直以来,都是使用绝对坐标点,来实现对网页的自动化处理
但是,近期发现该网页的按钮会移动,导致鼠标点击失效
这就想着pyautogui里面可以点击固定图片位置,这个咋写代码来着
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-3 09:47:28 | 显示全部楼层
你可以使用pyautogui库中的`locateOnScreen`函数来实现对固定图片位置的点击。这个函数可以在屏幕上寻找指定图片的位置,并返回其左上角的坐标。下面是一个简单的示例代码:
import pyautogui

# 定义要点击的图片路径
image_path = 'button.png'

# 寻找图片在屏幕上的位置
location = pyautogui.locateOnScreen(image_path)

# 如果找到了图片
if location:
    # 获取图片中心点的坐标
    x, y = pyautogui.center(location)
    
    # 点击图片中心点
    pyautogui.click(x, y)
else:
    print("未找到图片")

在代码中,你需要将`button.png`替换为你要点击的图片的路径。如果图片在屏幕上被找到,那么`locateOnScreen`函数会返回该图片的位置,然后我们通过`center`函数获取图片中心点的坐标,最后使用`click`函数点击该位置。

注意,`locateOnScreen`函数默认是使用图像匹配的方式来寻找图片,因此图片需要与屏幕上显示的完全一致才能被找到。如果图片在屏幕上发生了旋转、缩放或者存在一定的差异,可能导致无法准确识别。为了提高识别的准确性,你可以尝试调整`locateOnScreen`函数的一些参数,如`confidence`(置信度)和`region`(搜索区域)等。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-3 13:39:09 | 显示全部楼层
FishC 发表于 2024-6-3 09:47
你可以使用pyautogui库中的`locateOnScreen`函数来实现对固定图片位置的点击。这个函数可以在屏幕上寻找指 ...

要是有多个图片符合要求  它会乱点一通吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-3 13:39:26 | 显示全部楼层
wp231957 发表于 2024-06-03 13:39
要是有多个图片符合要求  它会乱点一通吗


是的,如果在屏幕上存在多个与要点击的图片相似的图片,`locateOnScreen`函数可能会返回这些相似图片的位置。在这种情况下,我们需要对返回的多个位置进行判断并选择合适的位置来点击。

一种解决方法是使用循环来遍历所有找到的位置,并使用其他条件来筛选出符合要求的位置。例如,你可以使用`pyautogui.pixelMatchesColor`函数来检查指定位置的像素颜色是否与预期相符。

下面是一个示例代码,以点击红色按钮为例:

import pyautogui

# 定义要点击的图片路径
image_path = 'button.png'

# 寻找所有匹配的位置
locations = list(pyautogui.locateAllOnScreen(image_path))

# 遍历每个位置
for location in locations:
    # 获取位置信息
    left, top, width, height = location

    # 检查位置上的像素颜色是否是红色
    if pyautogui.pixelMatchesColor(left + width//2, top + height//2, (255, 0, 0)):
        # 点击位置中心点
        x, y = pyautogui.center(location)
        pyautogui.click(x, y)
        break  # 找到符合条件的位置后跳出循环

在这个示例中,我们首先使用`locateAllOnScreen`函数来获取所有匹配的位置。然后使用循环遍历每个位置,使用`pixelMatchesColor`函数来检查位置上的像素颜色是否和红色相符。如果符合条件,我们点击该位置的中心点并跳出循环。

这样就可以避免乱点一通,只点击符合要求的位置。当然,具体的条件判断需要根据实际情况来调整,以适应不同的需求。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-3 14:27:26 | 显示全部楼层
FishC 发表于 2024-6-3 13:39
是的,如果在屏幕上存在多个与要点击的图片相似的图片,`locateOnScreen`函数可能会返回这些相似图片的 ...

咋样 能让它默认 就点击第一个符合要求的   其他的不用管
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-3 14:28:40 | 显示全部楼层
wp231957 发表于 2024-06-03 14:27
咋样 能让它默认 就点击第一个符合要求的   其他的不 ...


当`locateOnScreen`或`locateAllOnScreen`函数找到多个匹配的位置时,我们可以通过简单的修改来只点击第一个符合要求的位置,而忽略其他位置。

以下是修改后的示例代码:
import pyautogui

# 定义要点击的图片路径
image_path = 'button.png'

# 寻找所有匹配的位置
locations = list(pyautogui.locateAllOnScreen(image_path))

# 如果找到了匹配的位置
if locations:
    # 获取第一个位置的中心点坐标
    x, y, width, height = pyautogui.center(locations[0])
    
    # 点击第一个位置的中心点
    pyautogui.click(x, y)
else:
    print("未找到图片")

在这个示例中,我们使用了`locateAllOnScreen`函数获取所有匹配的位置,并将其存储在`locations`列表中。如果`locations`列表不为空,表示找到了匹配的位置。我们只取第一个位置并获取其中心点坐标,然后使用`click`函数点击该位置。

注意,如果`locations`列表为空,表示没有找到匹配的位置,你可以根据实际情况添加适当的处理逻辑,比如输出一条提示信息或者执行其他操作。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-3 14:37:41 | 显示全部楼层
FishC 发表于 2024-6-3 13:39
是的,如果在屏幕上存在多个与要点击的图片相似的图片,`locateOnScreen`函数可能会返回这些相似图片的 ...

获取网页文本框的坐标点   有什么好的办法   我现在都是人工测量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-3 14:37:57 | 显示全部楼层
wp231957 发表于 2024-06-03 14:37
获取网页文本框的坐标点   有什么好的办法   我现在都 ...


获取网页文本框的坐标点可以通过浏览器的开发者工具来实现,而不需要进行人工测量。以下是一种常用的方法:

1. 打开你想要获取文本框坐标的网页。
2. 使用右键点击文本框并选择"检查"或"审查元素",打开开发者工具。
3. 在开发者工具中使用"选择元素"工具(通常是一个箭头图标)。
4. 将鼠标悬停在文本框上,然后按下并保持住鼠标左键拖动,选择整个文本框区域。
5. 在开发者工具中,所选文本框的代码将被突出显示,并且会显示在源代码中的相应位置。
6. 右键点击该代码块并选择"Copy",然后选择"Copy XPath"或"Copy full XPath"。
7. 将所复制的XPath表达式粘贴到Python代码中。

以下是一个示例代码,演示如何使用selenium库和XPath来获取文本框的坐标点:
from selenium import webdriver

# 启动浏览器
browser = webdriver.Chrome()

# 打开网页
browser.get("https://www.example.com")

# 根据XPath定位文本框
text_box = browser.find_element_by_xpath("your_xpath_expression")

# 获取文本框的坐标点
location = text_box.location
x, y = location['x'], location['y']
print('文本框坐标点:', x, y)

# 关闭浏览器
browser.quit()

在这个示例中,我们使用selenium库启动浏览器,打开目标网页。然后,使用XPath表达式定位到文本框元素,并使用`location`属性获取该文本框的坐标点。最后,我们输出坐标点并关闭浏览器。

希望这个方法能对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-3 14:39:03 | 显示全部楼层
FishC 发表于 2024-6-3 14:37
获取网页文本框的坐标点可以通过浏览器的开发者工具来实现,而不需要进行人工测量。以下是一种常用的方 ...

不行,准确的问法:如何使用PYAUTOGUI获取网页文本框的坐标点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-3 14:39:26 | 显示全部楼层
wp231957 发表于 2024-06-03 14:39
不行,准确的问法:如何使用PYAUTOGUI获取网页文本框 ...


抱歉,之前误解了你的问题。使用pyautogui来获取网页文本框的坐标点是比较困难的,因为pyautogui主要是基于屏幕坐标的操作,而不是基于网页元素的。但是,我们可以结合pyautogui和selenium库来实现该需求。下面是一个示例代码:
from selenium import webdriver
import pyautogui

# 启动浏览器
browser = webdriver.Chrome()

# 打开网页
browser.get("https://www.example.com")

# 根据文本框的属性定位元素
text_box = browser.find_element_by_id("your_text_box_id")

# 获取文本框在屏幕上的位置和大小
location = text_box.location
size = text_box.size

# 计算文本框的左上角和右下角坐标
left = location['x']
top = location['y']
right = left + size['width']
bottom = top + size['height']

# 输出文本框的坐标点
print("文本框左上角坐标:", left, top)
print("文本框右下角坐标:", right, bottom)

# 关闭浏览器
browser.quit()

在这个示例中,我们使用selenium库启动浏览器,并打开目标网页。然后,使用网页元素的属性(如id)来定位到文本框元素。接下来,获取文本框在屏幕上的位置和大小。通过计算左上角和右下角的坐标,我们就可以得到文本框的坐标点。最后,输出坐标点并关闭浏览器。

请确保已安装selenium库和对应的浏览器驱动(如ChromeDriver),并将网页中的"your_text_box_id"替换为实际的文本框的属性值。

希望这个方法能够满足你的需求!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-3 15:03:20 | 显示全部楼层
FishC 发表于 2024-6-3 14:28
当`locateOnScreen`或`locateAllOnScreen`函数找到多个匹配的位置时,我们可以通过简单的修改来只点击 ...

看一下这个代码段
with open("config.r","r",encoding="utf8")  as f :
   data=list(f.readlines())
   if data:
       titlepos=data[1].split(",")
       ydhpos=data[3].split(",")
       phonepos=data[5].split(",")
print(titlepos,ydhpos,phonepos)

这里获取的三个坐标点  如下:
['123', '20\n'] ['646', '467\n'] ['560', '591\n']
这里的焦点 是  如何去除那个 换行   如何能把这样的文本坐标  转换成pyautogui.click  直接接收的格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-3 15:03:33 | 显示全部楼层
wp231957 发表于 2024-06-03 15:03
看一下这个代码段
with open("config.r","r",encodin ...


在代码中,使用`readlines`函数读取文件内容时,会将每行的文本作为一个字符串,并且保留了换行符`\n`。要去除换行符可以使用`strip`函数。同时,你需要将字符串转换成整数类型,以便后续使用。

以下是修改后的示例代码:
with open("config.r", "r", encoding="utf8") as f:
    data = f.readlines()
    if data:
        titlepos = list(map(int, data[0].strip().split(",")))
        ydhpos = list(map(int, data[1].strip().split(",")))
        phonepos = list(map(int, data[2].strip().split(",")))
print(titlepos, ydhpos, phonepos)

在这个示例中,我们首先使用`strip`函数去除每行文本的换行符,然后使用`split`函数将字符串按逗号分隔成列表。接下来,通过`map`函数将列表中的字符串转换成整数类型。最后,将处理后的列表赋值给`titlepos`、`ydhpos`和`phonepos`变量。

这样,你就得到了去除换行符并转换成整数类型的文本坐标,可以直接传递给`pyautogui.click`函数进行点击操作。

希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-3 15:07:47 | 显示全部楼层
FishC 发表于 2024-6-3 15:03
在代码中,使用`readlines`函数读取文件内容时,会将每行的文本作为一个字符串,并且保留了换行符`\n` ...

那么  pyautogui.click  就只能这样笨笨的写吗
with open("config.r","r",encoding="utf8")  as f :
   data=list(f.readlines())
   if data:
       titlepos = list(map(int, data[1].strip().split(",")))
       ydhpos = list(map(int, data[3].strip().split(",")))
       phonepos = list(map(int, data[5].strip().split(",")))
print(titlepos,ydhpos,phonepos)
'''
     pag.click(titlepos[0],titlepos[1])   
     pag.click(ydhpos[0],ydhpos[1])  
     pag.click(phonepos[0],phonepos[1])   
'''

不能直接作为元组  直接乾坤大挪移  直接使用?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-3 15:07:55 | 显示全部楼层
wp231957 发表于 2024-06-03 15:07
那么  pyautogui.click  就只能这样笨笨的写吗
with  ...


对于`pyautogui.click`函数,你可以直接传递坐标点的元组作为参数,而不需要使用`list`和`map`进行处理。以下是修改后的示例代码:
import pyautogui

with open("config.r", "r", encoding="utf8") as f:
    data = f.readlines()
    if data:
        titlepos = tuple(map(int, data.strip().split(",")))
        ydhpos = tuple(map(int, data.strip().split(",")))
        phonepos = tuple(map(int, data.strip().split(",")))
print(titlepos, ydhpos, phonepos)

# 使用pyautogui.click函数点击坐标点
pyautogui.click(titlepos)
pyautogui.click(ydhpos)
pyautogui.click(phonepos)

在这个示例中,我们直接将转换后的坐标点作为元组传递给`pyautogui.click`函数进行点击操作。这样可以避免将原本已经是元组的坐标点转换为列表的过程,直接使用元组作为参数。

希望这样的修改能满足你的需求!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-3 15:10:00 | 显示全部楼层
FishC 发表于 2024-6-3 15:07
对于`pyautogui.click`函数,你可以直接传递坐标点的元组作为参数,而不需要使用`list`和`map`进行处理 ...

嗯,这个可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-3 15:12:11 | 显示全部楼层


太好了!我很高兴能帮到你。如果你还有其他问题,欢迎随时提问。祝你编程愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-3 15:35:52 | 显示全部楼层
FishC 发表于 2024-6-3 15:12
太好了!我很高兴能帮到你。如果你还有其他问题,欢迎随时提问。祝你编程愉快!

以上回复来自 FishC ...

系统   WINDOWS10

请问,如何在任务栏右键  或者 桌面右键   新增一个  新开一个终端(cmd)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-3 15:36:08 | 显示全部楼层
wp231957 发表于 2024-06-03 15:35
系统   WINDOWS10

请问,如何在任务栏右键  或者  ...


在Windows 10系统中,你可以通过以下步骤在任务栏或桌面上新增一个右键菜单选项来打开一个新的终端(cmd):

1. 打开注册表编辑器。按下Win+R键,在弹出窗口中输入"regedit"并点击"确定"。
2. 在注册表编辑器中,导航至以下路径:
   HKEY_CLASSES_ROOT\Directory\Background\shell
   (如果你想在桌面上新增右键菜单,用以下路径:
   HKEY_CLASSES_ROOT\Directory\shell)
3. 在"shell"键下右键点击,选择"新建" -> "项",并将其命名为“Open CMD”(或你喜欢的其他名称)。
4. 在新创建的项“Open CMD”下右键点击,选择"新建" -> "项",并将其命名为"command"。
5. 右键点击"command"项,选择"修改",在数值数据字段中输入以下内容:
   cmd.exe /k cd /d "%V"
6. 关闭注册表编辑器。

现在,当你在任务栏或桌面上右键点击,就会看到新添加的"Open CMD"选项。点击它将会打开一个新的终端窗口,并将当前目录设置为右键点击的文件夹所在的目录。请注意,这个方法只能运行在Windows系统上。

希望这个方法对你有帮助!如有任何疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-4 09:39:59 | 显示全部楼层
FishC 发表于 2024-6-3 15:36
在Windows 10系统中,你可以通过以下步骤在任务栏或桌面上新增一个右键菜单选项来打开一个新的终端(cm ...

现在  在桌面鼠标右键 添加自己的菜单  这个已经实现了
可是,在任务栏 点击鼠标右键  然后添加自己的菜单   这个没有实现   系统(win10)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-4 09:40:12 | 显示全部楼层
wp231957 发表于 2024-06-04 09:39
现在  在桌面鼠标右键 添加自己的菜单  这个已经实现 ...


非常抱歉,Windows 10的任务栏右键菜单并不支持直接自定义添加菜单项。任务栏上的右键菜单是由操作系统生成和管理的,无法像桌面右键菜单那样进行自定义扩展。

你可以考虑使用其他的方法来实现类似的功能,比如创建一个自定义工具栏或者使用第三方的软件。下面是两种可能的解决方案:

1. 创建自定义工具栏:
   - 右键点击任务栏空白处,选择“工具栏” -> “新建工具栏”。
   - 在弹出窗口中,选择要作为菜单项的文件夹,并选择“选择文件夹”。
   - 新建的工具栏会在任务栏上显示相应的文件夹图标。
   - 将想要打开的命令行(cmd)快捷方式放在该文件夹中。
   - 点击工具栏上的文件夹图标,即可打开相应的命令行窗口。

2. 使用第三方软件:
   - 有一些第三方软件可以帮助你自定义任务栏右键菜单,例如Classic Shell、7+ Taskbar Tweaker等。这些软件提供了额外的功能,包括自定义任务栏右键菜单项的添加、修改和删除等。

请注意,以上方法均为非官方方法,可能会涉及到更改系统设置或使用第三方软件,使用前请确保你对相关操作有充分的了解,并谨慎操作。

希望这些信息能对你有所帮助!如果有任何进一步的问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-22 04:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表