2010年1月19日 星期二

python 區域模糊找圖

python 區域模糊找圖

====================
原由:
====================
此功能就像是按鍵精靈中的"區域模糊找圖"一樣
可以指定一個區域,然後找到所需要的圖片,並傳回座標

會寫這程式其實是因為按鍵精靈實在是不太好掌控
稍微複雜一點的就寫不出來 = ="(語法不合胃口 顆顆)

所以就想到弄別的程式語言寫,不過我最熟悉的只有PHP

也不能來做這檔事

所以就研究起來之前想學的語言PYTHON
(順便學一學)

經過一個晚上的研究,以及找方法
(= =中文資料真的頗少)

終於...發現了幾個可以抓取螢幕的小程式
(顆顆 所以才PO上來)

也經過了一個早上才終於寫出來
不過速度還是有點不太理想(已經有稍微修正,可是還是不盡理想)
====================
程式碼
====================
import psyco
psyco.full()
from PIL import Image, ImageGrab
import math
#FindPic(左上X,左上Y,右下X,右下Y,圖檔路徑,相似度)
def FindPic(ux,uy,dx,dy,path,like):
imS = ImageGrab.grab((ux,uy,dx,dy))
imD = Image.open(path)
for x in range(imS.size[0]-imD.size[0]):
for y in range(imS.size[1]-imD.size[1]):
if(imD.size[0] >= imD.size[1]): #這邊是快速版,只比對斜線
r = imD.size[1]
else:
r = imD.size[0]
t = 0
ct = 0
for xy in range(r):
(DR,DG,DB) = imD.getpixel((xy,xy))
(SR,SG,SB) = imS.getpixel((xy+x,xy+y))
if(DR==SR and DG==SG and DB==SB):
t=t+1
if(t >= r*like):
ct=1
#return x+ux,y+uy #這邊是快速版,只比對斜線
c = 0
e = 0
if(ct==1):#這邊是完整比對
for imDX in range(imD.size[0]):
for imDY in range(imD.size[1]):
(DR,DG,DB) = imD.getpixel((imDX,imDY))
(SR,SG,SB) = imS.getpixel((imDX+x,imDY+y))
if(DR==SR and DG==SG and DB==SB):
c = c+1
if(c >= imD.size[0]*imD.size[1]*like):
return x+ux,y+uy
else:
e = e+1
if(e >imD.size[0]*imD.size[1]*(1-like)):
break;break;
return -1,-1

print FindPic(85,45,150,100,"c:\\re.bmp",1)
#print FindPic(0,0,1024,768,"c:\\re.bmp",1) #re.bmp 要24位元的

====================
附註
====================
此程式需要加裝
psyco (可以省略,速度約差三分之一到二分之一)
PIL
記得縮排
====================
此程式速度還在想加速的方法 = ="
如果要使用 盡量把區域設小一點,不要設全螢幕
不然,可能要很久很久(九秒...)
print FindPic(0,0,1024,768,"c:\\re.bmp",1)

不過如果有限制的話
速度就還可以接受摟!!
print FindPic(85,45,150,100,"c:\\re.bmp",1)


================END==================