Python 像素在那里,但是.getpixel不在';我没发现

Python 像素在那里,但是.getpixel不在';我没发现,python,python-3.x,python-imaging-library,cv2,Python,Python 3.x,Python Imaging Library,Cv2,我目前的程序有一个问题,我不太确定如何解决 我正在做以下工作: x=0 y=0 im=ImageGrab.grab() 时间。睡眠(1) 尽管如此: xy=(x,y) x=x+1 如果im.getpixel(xy)==(0158187): 睡眠时间(0.3) pyautogui。单击(x,y) 打破 如果x>=1200: x=0 y=y+1 打印('找不到像素') 如果y>=950: y=0 x=0 它在90%的时间里工作,然后有一个随机的时间,它只是说它不能检测像素,尽管像素100%在那里

我目前的程序有一个问题,我不太确定如何解决

我正在做以下工作:

x=0
y=0
im=ImageGrab.grab()
时间。睡眠(1)
尽管如此:
xy=(x,y)
x=x+1
如果im.getpixel(xy)==(0158187):
睡眠时间(0.3)
pyautogui。单击(x,y)
打破
如果x>=1200:
x=0
y=y+1
打印('找不到像素')
如果y>=950:
y=0
x=0
它在90%的时间里工作,然后有一个随机的时间,它只是说它不能检测像素,尽管像素100%在那里

编辑:在发生的10%事件中成功捕获以下错误:

AttributeError:“非类型”对象没有属性“getpixel”


这是没有意义的,因为我事先做了
im=ImageGrab.grab()
,它90%的时间都能正常工作您应该在使用数据之前检查您的
ImageGrab()
是否成功,所以类似于:

im = ImageGrab.grab()
if im is not None:
   processImage

如果您在图像上运行双
for
循环,并为每个循环调用一个函数,您将整天都在那里!尝试养成在Python中为图像使用Numpy矢量化代码的习惯

基本上,您似乎正在测试1200x950图像中的任何像素是否与所有三个RGB组件匹配
(0158187)

你可以用Numpy这样做:

 np.any(np.all(na==(0,158,187), axis=-1))
在下面的演示中,双
for
循环需要800毫秒,Numpy测试需要20毫秒,因此速度要快40倍

#!/usr/bin/env python3

import numpy as np
from PIL import Image

def loopy(im):
   for x in range(im.width):
      for y in range(im.height):
         if im.getpixel((x,y)) == crucialPixel:
            return True

   return False


def me(im):
    # Make image into Numpy array
    na = np.array(im)
    # Test if there is any pixel where all RGB components match crucialPixel
    return np.any(np.all(na==crucialPixel, axis=-1))

# Define our beloved crucial pixel
crucialPixel = (0,158,187)

# Construct a new, solid black image
im = Image.new('RGB', (1200,950))

# Neither should find crucialPixel in black image
result = loopy(im)
result = me(im)

# Insert the crucial pixel
im.putpixel((600,475), crucialPixel)

# Both should find crucialPixel
result = loopy(im)
result = me(im)

问题不在于它无法检测像素。问题是
ImageGrab.grab
失败。您可能需要对此进行检查,然后稍后重试。为什么在抓取屏幕后等待一秒钟再搜索位图?@TimRoberts没有具体的原因,问题是如果需要,这个程序要连续运行8小时,我不能让ImageGrab。grab随机失败,没有任何原因。我通过这样做找到了一个半修复方法:while True:if im is None:im=ImageGrab.grab()else:break问题是它有时还是会以某种方式发生……完全正确的观点,但没有解决实际问题。哇,这确实令人印象深刻,快了40倍。我不知道你可以用numpy做这件事,真的让我想到了所有我还不知道的事情,这些事情可以让我的程序快10倍hahaha@MadPhysicist谢谢你让我一直坚持下去。我试图改进我的答案。@MarkSetchell有没有办法让numpy返回像素的坐标?我需要它,因为我需要我的鼠标点击这些坐标,替换
np.any(…)
Y,X=np.argwhere(np.all(na==cracialpixel,axis=-1))
并查看X和Y的第一个元素(如果它们不是无)。