注:文章代码中APPID AK SK部分为你自己的百度ai账号中申请到的ID 申请地址 本代码作者接触Python时间并不长,若其中有错误,请大家指出
(获取的手机摄像头内容是要打开手机照相机软件然后使用电脑adb命令对手机进行截图,而不是直接获取摄像头)
准备工作:
- 安装Python开发环境
- 安装Python中的Pillow库
- 下载百度ai调用包
- 下载adb驱动,并且打开手机USB调试权限
先祭上代码:
from aip import AipOcr
import os
from PIL import Image
from itertools import permutations
""" 你的 APPID AK SK """
APP_ID = '1***3'
API_KEY = 'SCt******es'
SECRET_KEY = 'lx**********GM'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
def get_screenshot():
"""获取手机截图>>screenshot.png"""
os.system('adb shell /system/bin/screencap -p /sdcard/screenshot.png')#截图至手机内存
os.system('adb pull /sdcard/screenshot.png screenshot.png')#将截图取至电脑
def math(num1,num2,num3,num4):
'''计算24点'''
sign = ['+','-','*','/']
num = [num1,num2,num3,num4]
order = list(permutations([0,1,2,3],4)) # 进行数字排列
for i in sign:
for j in sign:
for k in sign:
for l in order:
try:
l1 = l[0]
l2 = l[1]
l3 = l[2]
l4 = l[3]
#print(l1,l2,l3,l4)
# 第一种 (a b) (c d)
answer = '(' + str(num[l1]) + i + str(num[l2]) + ')' + j + '(' + str(num[l3]) + k + str(num[l4]) + ')'
if eval(answer) == 24:
print(answer + "=24")
# 第二种 ( ( a b ) c ) d
answer = '(' + '(' + str(num[l1]) + i + str(num[l2]) + ')' + j + str(num[l3]) + ')' + k + str(num[l4])
if eval(answer) == 24:
print(answer + "=24")
# 第三种 (a (b c)) d
answer = '(' + str(num[l1]) + i + '(' + str(num[l2]) + j + str(numl3) + ')' + ')' + k + str(num[l4])
if eval(answer) == 24:
print(answer + "=24")
# 第四种 a ((b c) d)
answer = str(num[l1]) + i + '(' + '(' + str(num[l2]) + j + str(num[l3]) + ')' + k + str(num[l4]) + ')'
if eval(answer) == 24:
print(answer + "=24")
#print(answer + '=' + str(eval(answer)))
# 第五种 a (b (c d))
answer = str(num1) + i + '(' + str(num2) + j + '(' + str(num3) + k + str(num4) + ')' + ')'
if eval(answer) == 24:
print(answer + "=24")
#print(answer + '=' + str(eval(answer)))
except:
pass
#执行部分
get_screenshot()
pic = Image.open('screenshot.png')
cropped = pic.crop((5,912,1429,1803))
cropped.save("./cropped.png")
with open('cropped.png','rb') as img:
finally_picture = img.read()
numbers = client.basicAccurate(finally_picture)
print(numbers)
try:
numberlist = list(map(lambda x: int(x), list(numbers['words_result'][0]['words'])))
print('识别结果为', numberlist)
except:
print('识别错误')
math(numberlist[0],numberlist[1],numberlist[2],numberlist[3])
下面是运行过程
下面是其中一小段运算结果
现在再来解释一下代码,
from aip import AipOcr
import os
from PIL import Image
from itertools import permutations
""" 你的 APPID AK SK """
APP_ID = '1***3'
API_KEY = 'SCt******es'
SECRET_KEY = 'lx**********GM'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
先是引用程序所需要应用到的库,并且初始化百度ai函数调用所需要的信息
其次就是定义获取手机截图的函数
def get_screenshot():
"""获取手机截图>>screenshot.png"""
os.system('adb shell /system/bin/screencap -p /sdcard/screenshot.png')#截图至手机内存
os.system('adb pull /sdcard/screenshot.png screenshot.png')#将截图取至电脑
此函数是运用电脑cmd命令调取adb来向手机获取截图,存在当前目录的screenshot.png中
再来定义计算24点的函数
24点的计算枚举共有5种计算方法
字母和括号之间为4种运算符号的一种
- ( a b ) ( c d )
- ( ( a b ) c ) d
- (a (b c)) d
- a ((b c) d)
- a (b (c d))
现在可以尝试一下排列出所有24点算式并进行计算
sign = ['+','-','*','/']
order = list(permutations([0,1,2,3],4)) # 进行数字排列
此时输出order的话,将会显示A44排列的所有结果
for i in sign:
for j in sign:
for k in sign:
for l in order:
*用过这一段代码后,i、j、k分别就是4个运算符号里的一个了,l便是所有排列情况中的一种 如:(2,3,1,0)
现在就可以组合式子了,就以第一种为例
# 第一种 (a b) (c d)
answer = '(' + str(num[l1]) + i + str(num[l2]) + ')' + j + '(' + str(num[l3]) + k + str(num[l4]) + ')'
if eval(answer) == 24:#计算算式结果,若结果为24则将此算式显示出来
print(answer + "=24")
这个语句可以产生类似(1+3)/(4*0)这样的算式
但是若是24点的4个数计算中产生了÷0这种计算的话,程序会出现错误,所以所有计算运算都要使用try语句才能够保证程序不会异常终止
现在计算24点的函数关键差不多就是这些了,现在到了如程序骨架一般的执行部分
get_screenshot()#调用自建函数进行截图
pic = Image.open('screenshot.png')#打开刚刚保存的截图文件
cropped = pic.crop((5,912,1429,1803))#裁剪出图片中中间部分,数值按照自己手机分辨率而定,我的是1440*2560手机分辨率
cropped.save("./cropped.png")#裁剪后进行保存(这步是为了程序运行完后可以查看图片)
with open('cropped.png','rb') as img:
finally_picture = img.read()#再次打开图片
处理完图像,数字的识别部分就交给百度ai去做了
numbers = client.basicAccurate(finally_picture)#将图片传上网进行识别,结果存在numbers变量
print(numbers)#可以看一下返回结果
try:
numberlist = list(map(lambda x: int(x), list(numbers['words_result'][0]['words'])))#提取出返回结果中的4个数字
print('识别结果为', numberlist)#看一下提取出来的4个数字
except:
print('识别错误')#因为识别总是有一个准确率,不可能每次成功,所以加一个try语句来提示识别错误
最后进行24点计算就完事了
math(numberlist[0],numberlist[1],numberlist[2],numberlist[3])#将识别结果的4个数字提取出来输至自制24点计算函数中
至此,本篇就结束了看在本人新手小编码字不易的情况下就提点学习建议吧