古剑识别灵力资源条

2018-10-21  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读