2012-02-21 12 views
8

Jestem nowy w Pythonie i jest to moja pierwsza rzecz kiedykolwiek mam scenariusza, a ja po prostu zastanawiasz się, co można zrobić, aby usunąć to ostrzeżenie:RuntimeWarning: Przepełnienie napotkał w 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 ve próbowałem szukać odpowiedzi i nic, co było dla mnie jasne, nie doprowadziło do ustalenia.

Próbuję napisać program, który porówna ciągłe aktualizowanie obrazu, które pochodzi z prostokąta wokół kursora z obrazem odniesienia, którego szukam.

Następnie, w zależności od regionu, w którym znajduje się kursor względem obrazu docelowego, dostosuje się odpowiednio.

Dziękujemy za pomoc, jakiej możesz udzielić!

-J

Kod jest poniżej:

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 

Odpowiedz

1

miałem podobny problem, że rozwiązane przez inicjowanie moje tablice numpy jako int64 Typ danych:

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

, które mogą zwiększyć pamięć zajmowanego obrazu – BiA

0

myślę problemu wynika z tej linii:

pixeldiff=pixeldiff+currentdiff 

Należy pamiętać, że piksele są zwykle zapisywane w typach danych uint8, czyli od 0 do 255. Więc jeśli spróbujesz dodać dwa z nich, a przekroczy 255, to się nie powiedzie.

zrobić coś takiego:

pixeldiff = (pixeldiff+currentdiff)/2 

Będziesz nadal uzyskać dane relacyjne, ale zostanie on skompresowany do prawego wielkości 0-255.

+0

Problem jest w wierszu przed tym. Musi on zostać przekonwertowany do 'int()' tam. Jest już za późno w linii 'pixeldiff'. – blubberdiblub

8

Dodajecie razem dwie wartości uint8, co daje wartość uint8. Musisz przekształcić swoje typy danych w obliczeniach. Proponuję wypróbować to:

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

To powinno zadziałać.

+0

Problem jest już w linii przed tym. Musi on zostać przekonwertowany do 'int()' tam. Jest już za późno w linii 'pixeldiff'. – blubberdiblub

Powiązane problemy