RuntimeWarning:在ubyte_scalars中遇到溢出

时间:2012-02-21 20:10:44

标签: python image image-processing runtime warnings

我是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

3 个答案:

答案 0 :(得分:13)

您正在将两个uint8值相加,从而产生uint8值。您需要在计算中转换数据类型。我建议你试试这个:

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

这应该有效。

编辑:平衡支架

答案 1 :(得分:4)

我有一个类似的问题,我通过将我的numpy数组初始化为int64数据类型来解决:

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

答案 2 :(得分:1)

我认为你的问题源于这一行:

pixeldiff=pixeldiff+currentdiff

请记住,像素通常以uint8数据类型保存,为0到255.因此,如果您尝试添加其中两个并且超过255,则会失败。

做这样的事情:

pixeldiff = (pixeldiff+currentdiff)/2

您仍将获得关系数据,但它将被压缩为0-255的正确大小。