2012-02-21 6 views
8

Soy nuevo en Python y esta es mi primera cosa que he guión y me pregunto qué puedo hacer para eliminar esta advertencia:RuntimeWarning: desbordamiento encontró en ubyte_scalars

Warning (from warnings module): 
    File "C:\Users\Luri\Desktop\Bot Stuff\ImageSaver.py", line 76 
    currentdiff=abs(anread[w,h])-abs(bnread[w,h]) 
RuntimeWarning: overflow encountered in ubyte_scalars 

I' He intentado buscar en Google la respuesta y nada de lo que estaba claro para mí llegó hasta solucionarlo.

Estoy tratando de escribir un programa que comparará una imagen que se actualiza continuamente que se toma de un rectángulo alrededor de mi cursor con una imagen de referencia que estoy buscando.

Luego, dependiendo de la región en que se encuentre el cursor en relación con la imagen de destino, se ajustará en consecuencia.

¡Gracias por cualquier ayuda que pueda dar!

-J

Código es el siguiente:

import os 
import sys 
import time 
import Image 
import ImageGrab 
import win32api 
import numpy, scipy 

def mousePos(): 
#--------------------------------------------------------- 
#User Settings: 
    SaveDirectory=r'C:\Users\Luri\Desktop\Bot Stuff' 
    ImageEditorPath=r'C:\WINDOWS\system32\mspaint.exe' 
#Here is another example: 
#ImageEditorPath=r'C:\Program Files\IrfanView\i_view32.exe' 
#--------------------------------------------------------- 
    i,j = win32api.GetCursorPos() 
    print 'Your Cusor Position is:', i,j 
    time.sleep(1) 
    size = 112, 58 
#------------------- 
#data is defined as | x0y0 = [0,0] = (xpos-56,ypos-29) | x0y1 = [0,1] = (xpos-56,ypos+29) | x1y1 = [1,1] = (xpos+56,ypos+29) | x1y0 = [1,0] = (xpos+56,ypos-29) 
#Take In Image In Rectangle around cursor position to locate text of name 
    pixeldiff=0 
    currentdiff=0 
    NQ1=193395 
    NQ2=166330 
    NQ3=171697 
    NQ4=168734 
    NAC=190253 
    NBC=205430 
    x0=i-56 
    y0=j-29 
    x1=i+56 
    y1=j+29 
    box=[x0, y0, x1, y1] 
    img=ImageGrab.grab() 
    saveas=os.path.join(SaveDirectory,'fullscreen.jpg') 
    img.save(saveas) 
    editorstring='""%s" "%s"'% (ImageEditorPath,saveas) 
#Crop box around cursor 
    cursorbox=img.crop(box) 
    saveas=os.path.join(SaveDirectory,'cursorbox.jpg') 
    cursorbox.save(saveas) 
#Converts the given cursor rectangle to 8bit grayscale from RGB 
    out = cursorbox.convert("L") 
    saveas=os.path.join(SaveDirectory,'lmodecurbox.jpg') 
    out.save(saveas) 
#Takes the converted grayscale picture and converts it to an array 
    a=numpy.asarray(out) 
    aarray=Image.fromarray(a) 
    sizea = a.shape 
# print sizea 
# print a 
    anread=a[:] 
#Loads the reference image 
    reference=Image.open("referencecold.png") 
#Converts the given cursor rectangle to 8bit grayscale from RGB 
    refout = reference.convert("L") 
    saveas=os.path.join(SaveDirectory,'lmoderefbox.jpg') 
    refout.save(saveas) 
#Takes the converted grayscale picture and converts it to an array 
    b=numpy.asarray(refout) 
    barray=Image.fromarray(b) 
    sizeb = b.shape 
# print sizeb 
# print b 
# print size 
    bnread=b[:] 
# print bnread 
#Realized you can determine position based on this single quadrant 
#Loop Quadrant 1 x0y1 to xmym 
    for h in range(0,29): 
    for w in range(0,55): 
     #currentdiff=0 
     currentdiff=abs(anread[w,h])-abs(bnread[w,h]) 
     pixeldiff=pixeldiff+currentdiff 
# print pixeldiff 
#Test Above 
    if pixeldiff<198559 and pixeldiff>190253: 
    #Test Left 
    if pixeldiff > 175000: 
    #Move Above and Left 
     print ('Go Up and Left') 
    else: 
    #Move Above Right 
     print ('Go Up and Right') 
    if pixeldiff>198559 and pixeldiff<205430: 
    if pixeldiff < 185000: 
    #Move Below and Left 
     print ('Go Down and Left') 
    else: 
    #Move Below and Right 
     print ('Go Down and Right') 
""" 
#Nominal Q1=193395 Variance low = 188408 Variance high = 203194 
#Nominal Q2=166330 Variance low = 181116 Variance high = 199208 
#Nominal Q3=171697 Variance low = 172279 Variance high = 201816 
#Nominal Q4=168734 Variance low = 190644 Variance high = 191878 
#Nominal Center = 198559 
#Nominal Above Center = 190253 
#Nominal Below Center = 205430 
#Loop Quadrant 2 xmy1 to x1ym 
    for h in range(0,29): 
    for w in range(55,111): 
     difference=abs(a(w,h)-b(w,h)) 
     currentdiff=abs(anread[w,h])-abs(bnread[w,h]) 
     pixeldiff=pixeldiff+currentdiff 
#Loop Quadrant 3 x0ym to xmy0 
    for h in range(29,57): 
    for w in range(0,55): 
     difference=abs(a(w,h)-b(w,h)) 
     currentdiff=abs(anread[w,h])-abs(bnread[w,h]) 
     pixeldiff=pixeldiff+currentdiff 
#Loop Quadrant 4 xmym to x1y0 
    for h in range(29,57): 
    for w in range(55,111): 
     difference=abs(a(w,h)-b(w,h)) 
     currentdiff=abs(anread[w,h])-abs(bnread[w,h]) 
     pixeldiff=pixeldiff+currentdiff 
#Fine Nominal Values for Each quadrant pixeldiff 
#Compare which is similar and then move cursor in center of that quadrant 
""" 

def main(): 
# while True: 
    mousePos() 

if __name__ == "__main__": 
    main() 




#Compare image to constantly updating image of rectangle around cursor (maybe per second?) by searching for the quadrant with most similarity 

#------------------- 

#Based on comparison, move cursor to middle (x and y value) of matched quadrant by population of similar features and repeat 

Respuesta

1

que tenía un problema similar que resolví inicializando mis matrices numpy como un tipo de datos int64:

imAnchor = array(Image.open(imList[10]), dtype='int64') 
+0

que podría aumentar la memoria que ocupa la imagen – BiA

0

Creo que su problema proviene de esta línea:

pixeldiff=pixeldiff+currentdiff 

Recuerde que los píxeles normalmente se guardan en el tipo de datos uint8, que es de 0 a 255. Por lo tanto, si intenta agregar dos y supera los 255, se producirá un error.

hacer algo como esto:

pixeldiff = (pixeldiff+currentdiff)/2 

seguirá recibiendo los datos relacionales, pero va a ser comprimido en el tamaño adecuado de 0-255.

+0

El problema está en la línea anterior. Necesita ser convertido a 'int()' allí. Ya es demasiado tarde en la línea 'pixeldiff'. – blubberdiblub

8

Está agregando dos valores uint8 juntos, lo que da como resultado un valor de uint8. Necesita transformar sus tipos de datos en el cálculo. Sugiero que intente esto:

pixeldiff = (int(ipxeldiff)+int(currentdiff)/2 

Esto debería funcionar.

+0

El problema ya está en la línea antes de eso. Necesita ser convertido a 'int()' allí. Ya es demasiado tarde en la línea 'pixeldiff'. – blubberdiblub

Cuestiones relacionadas