古剑识别灵力资源条
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.jpg1. 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
想办法计算出a
和b
即可
优化
首先准备好一批数据image_list
准备好image_x
和image_y
image_list = [image...]
image_y = np.array([100,14,18,....])
image_x = np.array(image_list.map(area_size).to_list(),dtype="float")
然后来个最小二乘法就可以得到a
和b
了,
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)
得到的a
和 b
就可以直接用啦
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