用Python获取手机摄像头内容并进行手写数字识别计算24点

注:文章代码中APPID AK SK部分为你自己的百度ai账号中申请到的ID 申请地址
本代码作者接触Python时间并不长,若其中有错误,请大家指出

(获取的手机摄像头内容是要打开手机照相机软件然后使用电脑adb命令对手机进行截图,而不是直接获取摄像头)

准备工作:

  1. 安装Python开发环境
  2. 安装Python中的Pillow库
  3. 下载百度ai调用包
  4. 下载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种运算符号的一种

  1. ( a b ) ( c d )
  2. ( ( a b ) c ) d
  3. (a (b c)) d
  4. a ((b c) d)
  5. 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点计算函数中

至此,本篇就结束了
看在本人新手小编码字不易的情况下就提点学习建议吧

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值