用python写个连连看外挂,于是just do it。就是识别率略低
###################################################################
#encoding=utf-8
import os
import os.path
import shutil
from PIL import Image
from PIL import ImageFilter
from PIL import ImageOps
from pyautogui import *
import time
def getCode(img,size):
result = []
# print("x==",size[0])
# print("y==",size[1]-1)
x_size = size[0]-1#width
y_size = size[1] #high
for x in range(0,x_size):
for y in range(0,y_size):
now_value = img.getpixel((x,y))
next_value = img.getpixel((x+1,y))
if next_value < now_value:
result.append(1)
else:
result.append(0)
return result
def compCode(code1,code2):
num = 0
for index in range(0,len(code1)):
if code1[index] != code2[index]:
num+=1
return num
#This module can classfy the image by dHash
def classfiy_dHash(image1,image2,size=(9,8)):
''' 'image1' and 'image2' is a Image Object.
You can build it by 'Image.open(path)'.
'Size' is parameter what the image will resize to it and then image will be compared to another image by the dHash.
It's 9 * 8 when it default.
The function will return the hamming code,less is correct.
'''
image1 = image1.resize(size).convert('L')
code1 = getCode(image1, size)
image2 = image2.resize(size).convert('L')
code2 = getCode(image2, size)
assert len(code1) == len(code2),"error"
return compCode(code1, code2)
def mkdir(path):
# 去除首位空格
path=path.strip()
# 去除尾部 \ 符号
path=path.rstrip("\\")
# 判断路径是否存在
# 存在 True
# 不存在 False
isExists=os.path.exists(path)
# 判断结果
if not isExists:
# 如果不存在则创建目录
print path+' 创建成功'
# 创建目录操作函数
os.makedirs(path)
return True
else:
# 如果目录存在则不创建,并提示目录已存在
print path+' had exits'
return False
def splitImage(imageName, pathName, row, col):
cnt = 0
img = Image.open(imageName)
ori_w,ori_h = img.size
row = 4
col = 4
mkdir(pathName)
for j in range(0, col):
Y = j*ori_h/col
Y_end = Y + ori_h/col
for i in range(0, row):
X = i*ori_w/row
X_end = X + ori_w/row
print X, X_end
fileName = '%s/a_%d.png' %(pathName, cnt)
img.crop((X, Y, X_end, Y_end)).save( fileName )
cnt+=1
#颜色空间直方图计算
def pil_image_similarity(filepath1, filepath2):
from PIL import Image
import math
import operator
image1 = Image.open(filepath1)
image2 = Image.open(filepath2)
# image1 = get_thumbnail(img1)
# image2 = get_thumbnail(img2)
h1 = image1.histogram()
h2 = image2.histogram()
rms = math.sqrt(reduce(operator.add, list(map(lambda a,b: (a-b)**2, h1, h2)))/len(h1) )
return rms
def pil_image_similarityDHash(filepath1, filepath2):
image1 = Image.open(filepath1)
image2 = Image.open(filepath2)
dhash = classfiy_dHash(image1, image2 )
sum = 64
penc = (sum - dhash)*1.0/sum
#print dhash, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", filepath1, filepath2
return penc
def FindOutDistinct(sourcePath, destPath):
picDirDistinct=[]
picDir = []
mkdir(destPath)
for root, dirs, files in os.walk(sourcePath):
for name in files:
picDir.append(os.path.join(root, name))
#print picDir
for i in range(0, len(picDir)):
find = False
for j in range(0, len(picDirDistinct)):
#print i,j
if pil_image_similarity(picDir[i], picDirDistinct[j])< 30:
find = True
print "find ", picDir[i], picDirDistinct[j]
break
if not find:
picDirDistinct.append(picDir[i])
print picDirDistinct
for item in picDirDistinct:
shutil.copy(item, destPath)
def FindAndClick(destPath):
picDir = []
mkdir(destPath)
for root, dirs, files in os.walk(destPath):
for name in files:
picDir.append(os.path.join(root, name))
while True:
T = []
for item in picDir:
print item
PT = []
for pos in locateAllOnScreen(item, grayscale=True):
PT.append(pos)
if 0 != len(PT):
T.append(PT)
print PT
for i in range(0, len(PT)):
for j in range(i+1, len(PT)):
click(center(PT[i]))
time.sleep( 2 )
click(center(PT[j]))
time.sleep( 2 )
print T
if 0 == len(T):
break
time.sleep( 10 )
sourcePath = "testSplit"
destPath = "testSplitDistinct"
if os.path.exists(sourcePath):
shutil.rmtree(sourcePath)
splitImage("1.bmp", sourcePath, 4,4)
FindOutDistinct(sourcePath, destPath)
FindAndClick(destPath)