`
colorfire
  • 浏览: 33601 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自动登录脚本之图像识别

阅读更多
仅做个保留吧,等完成之后一起写。

import Image,ImageFont,ImageDraw
import os,sys
from math import atan2,pi
import pickle

DURATION = 1000
DIAMETER = 20
COLORDIFF = 10
TEXTCOLOR = (128,128,128)
BACKGROUND = (255,255,255)
MODE = 'sample'
samples = None


def purifyIM(image):
    frame = image.load()
    (w,h)=image.size
    for i in range(h):
        for j in range(w):
            if frame[j,i] < TEXTCOLOR:
                image.putpixel( (j,i), TEXTCOLOR )
            else:
                image.putpixel( (j,i), BACKGROUND )
    return image

def purify(region):
    frame = region.getdata()
    (w,h)=region.size
    for i in range(h):
        for j in range(w):
            if frame[i*w+j] != BACKGROUND and frame[i*w+j] != (0,0,0):
                region.putpixel( (j,i), TEXTCOLOR )
            else:
                region.putpixel( (j,i), BACKGROUND )
    return region

def printregion(region):
    frame = region.getdata()
    (w,h)=region.size
    f = file('testCode2.txt','w')
    for i in range(h):
        for j in range(w):
            if frame[i*w+j] != BACKGROUND:
                f.write('*')
            else:
                f.write(' ')
        f.write('\n')
    f.close()

def getImage(fname):
    im = Image.open(fname)
    return im

def normalize(im):
    regions = imdiv(im)
    if len(regions)!=4:
        regoins = imdiv2(im)
    for k in range(len(regions)):
        regions[k] = dorotate(regions[k])
        regions[k] = purify( docrop(regions[k]) )
    return regions

def dorotate(region):
    deg = 0
    maxdens = 0
    for i in range(-30,31):
        dens = density( docrop( region.rotate(i) ) )
        if dens > maxdens:
            deg = i
            maxdens = dens
    return region.rotate(deg)

def density(region):
    frame = region.getdata()
    (w,h) = region.size
    area_all = w*h
    area = 0
    for i in range(h):
        for j in range(w):
            if frame[i*w+j] != BACKGROUND and frame[i*w+j] != (0,0,0):
                area += 1
    return 1.0*area/area_all

def docrop(region):
    croppos = getcrop(region)
    newregion = region.crop(croppos)
    return newregion

def getcrop(region):
    frame = region.getdata()
    (w,h)=region.size
    pts = []
    ptsi = []
    for i in range(h):
        for j in range(w):
            if frame[i*w+j] != BACKGROUND and frame[i*w+j] != (0,0,0):
                pts.append((i,j))
                ptsi.append((j,i))
    if pts == []:
        return [0,0,1,1]
    pp1 = min(pts)
    pp2 = max(pts)
    pp3 = min(ptsi)
    pp4 = max(ptsi)
    return [pp3[0],pp1[0],pp4[0]+1,pp2[0]+1]

def crackcode(im):
    global samples
    if not samples:
        samples = loadsamples()
    regions = normalize(im)
    s = []
    ans = []
    for r in regions:
        s.append(match(r,samples).upper())
    messup = ['TFY7','FE','38','72YT','CQGR6','G6C','XK','HK','89B','YV','VY']
    for i in range(len(s)):
        for mess in messup:
            if s[i] == mess[0]:
                s[i] = mess
    if len(s) != 4:
        return ['failed']
    else:
        for s1 in s[0]:
            for s2 in s[1]:
                for s3 in s[2]:
                    for s4 in s[3]:
                        t = s1+s2+s3+s4
                        ans.append(t)
    return ans

def match(region,samples):
    if samples == {}:
        return None
    dists = []
    for (k,v) in samples.items():
        dists.append( (distance(region,k),v) )
    dists.sort()
    if MODE == 'sample':
        return dists[0][1]
    else:
        i = 0
        while dists[i][1] in ['H','I']:
            i += 1
        return dists[i][1]

def distance(r1,r2):
    den1 = density(r1)
    den2 = density(r2)
    if 1.0*den1/den2>1:
        (den1,den2) = (den2,den1)
    r1 = r1.resize(r2.size)    
    d1 = r1.getdata()
    d2 = r2.getdata()
    same = [0,0]
    total = [0,0]
    for i in xrange(len(d1)):
        if d1[i] != BACKGROUND:
            total[0] += 1
            if d1[i] == d2[i]:
                same[0] += 1
        if d2[i] != BACKGROUND:
            total[1] += 1
            if d1[i] == d2[i]:
                same[1] += 1
    return 1 - 1.0*same[0]/total[0] * 1.0*same[1]/total[1] * 1.0*den1/den2

def loadsamples():
    pks = pickle.load(open('samples.pk','rb'))
    samples = {}
    for (pk,v) in pks.items():
        im = Image.new('RGB',pk[0])
        r = im.crop((0,0,pk[0][0],pk[0][1]))
        r.fromstring(pk[1])
        samples[r] = v
    return samples

def loadttf():
    files = [ 'ttf/'+x for x in os.listdir('ttf') ]
    fonts = []
    for f in files:
        fonts.append( ImageFont.truetype(f,32) )
    regions = []
    regionsv = []
    for font in fonts:
        im = Image.new( 'RGB', (1000,50), BACKGROUND )
        draw = ImageDraw.Draw(im)
        draw.text(  (0,0),"B C E F G H J K M P Q R T V W X Y 2 3 4 6 7 8 9"\
                ,font=font,fill=TEXTCOLOR )
        regions.extend( imdiv(im) )
        regionsv.extend( 'B C E F G H J K M P Q R T V W X Y 2 3 4 6 7 8 9'.split(' ') )
    for i in xrange(len(regions)):
        regions[i] = docrop(regions[i])    
        printregion( regions[i] )
    kv = {}
    for i in range(len(regions)):
        kv[regions[i]] = regionsv[i]
    return kv

def imdiv(im):
    frame = im.load()
    (w,h) = im.size
    horis =  []
    for i in range(w):
        for j in range(h):
            if frame[i,j] != BACKGROUND:
                horis.append(i)
                break
    horis2 = [max(horis[0]-2,0)]
    for i in range(1,len(horis)-1):
        if horis[i]!=horis[i+1]-1:
            horis2.append((horis[i]+horis[i+1])/2)
    horis2.append(min(horis[-1]+3,w))
    boxes=[]
    for i in range(len(horis2)-1):
        boxes.append( [horis2[i],0,horis2[i+1],h]  )
    for k in range(len(boxes)):
        verts = []
        for j in range(h):
            for i in range(boxes[k][0],boxes[k][2]):
                if frame[i,j] != BACKGROUND:
                    verts.append(j)
        boxes[k][1] = max(verts[0]-2,0)
        boxes[k][3] = min(verts[-1]+3,h)
    if boxes == []:
        return None
    regions = []
    for box in boxes:
        regions.append( im.crop(box) )
    return regions

def imdiv2(im):
    divs = {}
    frame = im.load()
    (w,h) = im.size
    for i in range(w):
        for j in range(h):
            color = frame[i,j]
            if color != BACKGROUND:
                if divs.has_key( color ):
                    divs[ color ].append( (i,j) )
                else:
                    divs[ color ] = [ (i,j) ]
    regions = []
    divs = [ (x[0],sorted(x[1],cmp=lambda x,y:cmp(x[1],y[1]))) for x in  divs.items() ]
    divs.sort(cmp=lambda x,y:cmp(x[1][0],y[1][0]))
    for (color,pts) in divs:
        xs = [ x[0] for x in pts ]
        ys = [ x[1] for x in pts ]
        box = ( min(xs), min(ys), min(max(xs)+1,w), min(max(ys)+1,h) )
        regions.append(im.crop(box))
    return regions

def train(im):
    print 1
    global samples
    try:
        samples = pickle.load(open('samples.pk','rb'))
    except:
        samples = {}
        pickle.dump(samples,open('samples.pk','wb'))
    regions = normalize(im)
    for region in regions:
        printregion(region)
        smps = loadsamples()
        printframeBy(region)
        print match(region,smps).upper()
        print 'Enter [0-9a-z] to add to library: '
        ans = raw_input()
        if len(ans) == 1:
            key = (region.size,region.tostring())
            samples[key] = ans[0]
            pickle.dump(samples,open('samples.pk','wb'))

def printframeBy(im,code=-1):
    frame = im.load()
    (w,h) = im.size
    for j in xrange(h):
        for i in xrange(w):
            if (code == -1 and frame[i,j] !=BACKGROUND) or (code != -1 and frame[i,j]==code) :
                print '*',
            else:
                print ' ',
        print

def identify(fname):
    image = getImage(fname)
    image = purifyIM(image)
    regions = normalize(image)
    ans = crackcode(image)
    return ans
    #printregion(regions[1])

def trainBy(fname):
    if sys.argv[1].startswith('train'):
        trainfiles = os.listdir(sys.argv[1])
        trainfiles.sort()
        for trainfile in trainfiles:
            trainfile = sys.argv[1]+'/'+trainfile
            print trainfile
            im = getImage(trainfile)
            im = purifyIM(im)
            train(im)

if __name__ == '__main__':
    if len(sys.argv) == 2:
        print "Run training"
        trainBy('genimg3.jpg')
    else:
        print "Run indentify"
        identify('genimg3.jpg')
分享到:
评论

相关推荐

    基于python实现的图像识别自动化脚本

    【作品名称】:基于python实现的图像识别自动化脚本 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 2.安装依赖包 ...

    AirtestIDE 是由网易开发的一款跨平台 UI 自动化测试工具,主要用于移动应用和游戏的自动化测试 它基于图像识别和脚本编

    Sikuli 兼容性:AirtestIDE 兼容 Sikuli,与之类似的图像识别功能使得测试脚本编写更加直观。 Poco 框架:内置的 Poco 框架支持基于 UI 元素树的自动化测试,提供了更精确的元素定位方式。 脚本编写与录制:支持通过...

    基于图像识别的跨平台的UI自动化测试编辑器AirtestIDE

    支持基于图像识别的Airtest框架,适用于所有Android/iOS/Windows应用 支持基于UI控件搜索的Poco框架,适用于Unity3d,Cocos2d与Android/iOS App等多种平台 能够运行在Windows、MacOS、Linux平台上

    22课 逆战自动开枪初始脚本_逆战自动开枪源码_逆战_

    总结,逆战自动开枪脚本的制作涉及到游戏编程、自动化工具的使用、图像识别技术以及安全性和合法性的考量。在实际应用中,开发者需要不断学习和适应游戏更新,以保持脚本的有效性。同时,了解并遵守相关法律法规,...

    【图像识别】图像识别训练集制作Matlab教程.zip

    【图像识别】图像识别训练集制作Matlab教程.zip是一个压缩包,其中包含了多个与图像识别相关的文件,旨在指导用户如何在Matlab环境下构建图像识别的训练数据集。这个教程可能适用于机器学习、深度学习和计算机视觉等...

    matlab图像识别程序2

    【标题】"matlab图像识别程序2"是一个关于利用MATLAB进行图像处理和识别的项目。这个项目可能涉及了图像的...用户可以通过运行和修改这些脚本来学习和改进图像识别的流程,这在学术研究和工程实践中有很高的价值。

    基于 TensorFlow 的深度学习图像识别模型的自动化测试方法.zip

    本项目实践将聚焦于使用TensorFlow这一强大的深度学习框架来构建和自动化测试图像识别模型。 TensorFlow是由Google Brain团队开发的开源库,它为构建和训练大规模机器学习模型提供了便利。这个"基于TensorFlow的...

    图像识别算法,相关matlab编程

    图像识别是计算机视觉领域的重要研究方向,主要涉及对图像中的对象、特征或模式进行自动识别。MATLAB作为一款强大的数值计算和数据可视化软件,经常被用于图像处理和识别的算法开发,而C++则因其高效性和灵活性,常...

    模式识别 图像识别(识别1~10)

    在提供的压缩包中,"MATLAB图像识别源代码"很可能包含了实现以上步骤的MATLAB脚本。MATLAB是一个强大的数学和工程计算环境,常用于图像处理和机器学习任务。源代码可能使用了MATLAB的Image Processing Toolbox和...

    麻将图像识别,通过截屏,识别牌面内容

    《麻将图像识别技术详解——基于VC++2010的实战开发》 麻将,作为中国传统的娱乐游戏,深受人们喜爱。然而,在现实生活中,我们可能会遇到一些需要自动识别麻将牌面的情况,例如智能麻将桌、游戏辅助软件等。这就...

    图像识别c#开发代码.zip

    在IT行业中,图像识别是一项重要的技术,特别是在自动化和人工智能领域。C#是一种广泛使用的编程语言,它可以用于构建复杂的软件系统,包括图像识别应用。在这个"图像识别c#开发代码.zip"压缩包中,我们主要关注的是...

    基于MATLAB的水果图像识别

    在这个项目中,"基于matlab的图像识别代码"包含了实现上述步骤的MATLAB脚本。用户可以根据自己的需求进行定制,比如添加更多类型的水果,或者调整识别算法以适应不同条件下的图像。通过实际运行代码并观察结果,可以...

    sp.rar_OpenCV图像识别_opencv 图像识别_图像识别_识别

    1. `sample.py` - 一个简单的Python脚本,演示如何使用OpenCV进行图像识别。 2. `haar_cascade.xml` - Haar特征级联分类器文件,用于人脸或其他物体检测。 3. `model.h5` - 存储预训练的深度学习模型,如CNN。 4. `...

    Python-ArkNights自动作战脚本

    1. **游戏状态检测**:使用`pyautogui`捕获屏幕,通过图像识别确定游戏当前的状态,如敌人位置、我方干员血量等。 2. **决策制定**:根据游戏状态,通过预设的规则或机器学习算法(如简单的状态机或深度强化学习)来...

    训练集+测试集(图像识别).7z

    标题中的“训练集+测试集(图像识别).7z”指的是一个用于图像识别任务的数据集,这个数据集被压缩成7z格式的文件。在机器学习和深度学习领域,训练集和测试集是必不可少的组成部分。训练集用于训练模型,而测试集则...

    python项目:自动发送邮件(爬虫相关)、游戏脚本尝试(图像识别与自动化操作)、算法入门学习.zip

    life is simple, i use Python 业余时间做的python项目:自动发送邮件(爬虫相关)、游戏脚本尝试(图像识别与自动化操作)、算法入门学习

    九阴真经自动团练、喝酒脚本关键源码

    它能够提供屏幕捕捉、图像识别、键盘鼠标模拟等功能,非常适合用于开发游戏辅助脚本。这里使用的是 JavaScript 接口。 #### 2. 图像识别与定位 脚本中多处使用了 `FindPic` 函数来查找指定图像的位置,例如 `dm....

    图像识别,分割,检测

    在IT领域,图像识别、分割和检测是计算机视觉的重要组成部分,它们在自动化、人工智能和机器学习等技术中扮演着至关重要的角色。以下是对这些概念的详细解释: 1. **图像识别**:图像识别是计算机科学的一个分支,...

    基于图像识别的跨平台测试脚本录制与回放系统的设计与实现1

    本论文提出并实现了一种基于图像识别的自动化测试脚本录制与回放系统,旨在解决这个问题。该系统模拟人工测试流程,通过远程控制设备,利用录制回放简化测试脚本开发,降低技术门槛。同时,通过在录制过程中捕获控件...

    Python-基于python图像识别实现的连连看自动玩可实现QQ连连看秒破

    本项目"Python-基于python图像识别实现的连连看自动玩可实现QQ连连看秒破"就是一个很好的实例,它利用Python进行图像识别技术,实现了QQ连连看游戏的自动游玩,甚至可以达到“秒破”的效果。下面我们将深入探讨这个...

Global site tag (gtag.js) - Google Analytics