美文网首页
古剑识别灵力资源条

古剑识别灵力资源条

作者: 烟流 | 来源:发表于2018-10-21 22:52 被阅读0次

    背景

    项目开源在这:https://github.com/1178615156/gjqt-script
    代码在这:https://github.com/1178615156/gjqt-script/blob/master/gjsp/skill/sm/sm_lin_li.py
    代码里假设资源条放在个位置 area_ling_li = (444, 898, 750, 913) ,如果不在这里需要自行修改

    目标

    识别出当前灵力数

    实现

    0. 截图然后将灵力条裁剪出来
    ling-li-34.jpg
    1. import 各种各样的包
    from PIL import Image
    import numpy as np
    import os
    from functional import seq
    import matplotlib.pyplot as plt 
    from scipy.optimize import leastsq
    
    
    img = Image.open(...)
    
    2. 简单观察下会发现灵力条基本是绿色的,除了背景和文字,所以先想办法把绿色的部分提取出来,
    def pretreatment(img):
        r,g,b = img.split()
        b = np.array(b)
        b = b > 190 
        b = b * 255
        return b 
    

    来看看效果:

    Image.fromarray(pretreatment(img).astype("uint8"))
    
    image.png

    看成功的识别出蓝色区域和非蓝色区域

    3. 计算蓝色区域的面积占整个资源条的面积之比
    def area_size(img):
        x = pretreatment(img)
        return np.count_nonzero(x) / x.size
    
    print(area_size(img))
    

    结果:
    0.1328976034858388
    和我们期望的真实的结果18有点差距

    仔细观察就会发现蓝色区域的面积是正比于当前的资源量的;
    假设:
    资源量 = a * 蓝色区域面积 + b
    想办法计算出ab即可

    优化

    首先准备好一批数据image_list

    image.png

    准备好image_ximage_y

    image_list = [image...]
    image_y = np.array([100,14,18,....])
    image_x = np.array(image_list.map(area_size).to_list(),dtype="float")
    
    

    然后来个最小二乘法就可以得到ab了,

    def error(p,x,y):
        a,b=p
        return  (b*x+b) -y
    p0=(1,20)
    
    leastsq(error,p0,args=(image_x,image_y))
    print(p0)
    

    得到的ab 就可以直接用啦

    def pred(img):
        return 115.31076412 * area_size(img) + 2.00410678
    
    测试
    fig=plt.figure()
    
    for index,img in enumerate(image_test):
        fig.add_subplot(len(list(image_test)),1,index+1).title.set_text(str(pred(img)))
        plt.imshow(img)
    plt.show()
    
    image.png

    相关文章

      网友评论

          本文标题:古剑识别灵力资源条

          本文链接:https://www.haomeiwen.com/subject/habizftx.html