web-dev-qa-db-ja.com

RuntimeWarning:ubyte_scalarsでオーバーフローが発生しました

私はPython=に不慣れです。これは私がスクリプトを作成した最初のことであり、この警告を削除するために何ができるのか疑問に思っています:

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

私は答えをグーグルで試してみましたが、これを修正するまで私には明らかなものは何もありませんでした。

私は、カーソルの周りの長方形から取得された継続的に更新される画像と、検索している参照画像を比較するプログラムを作成しようとしています。

次に、カーソルがターゲット画像に対してどの領域にあるかに応じて、それに応じて調整されます。

あなたが与えることができるあらゆる助けをありがとう!

-J

コードは以下の通りです:

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
15

2つのuint8値を加算すると、uint8値になります。計算でデータ型を変換する必要があります。これを試してみることをお勧めします:

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

これは動作するはずです。

編集:バランスブラケット

15
Zim

同様の問題があり、numpy配列をint64データ型として初期化することで解決しました。

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

私はあなたの問題はこの行に起因すると思います:

pixeldiff=pixeldiff+currentdiff

ピクセルは通常uint8データ型。0〜255です。2つ追加しようとして、255を超えると失敗します。

このようなことをしてください:

pixeldiff = (pixeldiff+currentdiff)/2

リレーショナルデータは引き続き取得できますが、0〜255の適切なサイズに圧縮されます。

2
user4465498