赞
踩
零基础自学python3有一段时间了,遂产生了做一个自动答题程序的想法。答题界面如下:
题型分为:多选题、单选题、判断题。
选择时,如果选择正确,手机app会自动进入下一题。如果选择错误,会进入失败界面。
以下为编程思路:
需要用到的库:
import os # 导入以后可以使用shell命令,python自带不用安装
from PIL import Image # PIL是一个对图片处理的库 python3 使用 pip install pillow 安装
from aip import AipOcr #百度ocr 使用 pip install baidu-aip 安装(需要调用百度api)
import time #导入后可以让程序等待一会儿,python自带不用安装
import pickle # 这个库可以保存变量,使用,python自带不用安装
需要安装:Android Debug Bridge(安卓调试桥) 简称adb,安装后可以使用电脑对手机进行操作(这里主要是模拟人手,点击手机屏幕)
附:adb详细安装教程
打开手机内的usb调试,把手机用数据线连接到电脑
在cmd内输入命令:adb devices
PS C:\Users\Administrator\Desktop> adb devices
List of devices attached
954a63434594453454 (#这一串字符,每台设备均不同) device
PS C:\Users\Administrator\Desktop>
若如上显示,则手机与电脑连接成功。
def screen_phone(): #用于截取手机屏幕并发送到电脑
os.system('adb shell screencap -p /sdcard/111.png') #截屏并将图片保存到手机
os.system('adb pull /sdcard/111.png C:/Users/Administrator/Desktop/data/phone/111.png') #讲手机内保存的截屏发送到电脑指定文件夹
print("开始截图!!!")
return crop_string() #截屏完成后,调用到修图函数
截屏取手机屏幕发送到电脑,得到如下图片
此图片分辨率是1080x2220,图片蓝色部分背景处无题目,没有作用且容易对接下来的ocr识别造成干扰。所以进行剪切。
def crop_string(): #将图片修剪
#这里的文件路径根据你自己系统的文件路径来填
im = Image.open("C:/Users/Administrator/Desktop/data/phone/111.png")
size=(0,600,1080,2220)
after_cut=im.crop(size) #crop需要的参数为(左,上,右,下)
after_cut.save("C:/Users/Administrator/Desktop/data/after cut/111.png") #保存修剪后的图片
im.close() #使用open以后随时记得close~~~
print("图片修剪完成")
return baidu_ocr() #调用图片识别
使用的是Image.crop()来对图片进行裁切的时候需要注意:
坐标原点在图片的左上角
crop函数带的参数为(左,上,右,下)
裁切后得到如下图片:
蓝色部分已经被去除。只剩下题目部分与确定键
使用百度的文字识别api来识别裁切后的图片**(目前个人账户每天可调用5万次)**
若对于此api调用不熟悉可以查看百度云的技术文档!
https://cloud.baidu.com/doc/OCR/index.html
开始对
def baidu_ocr(): APP_ID = '这里填你自己的百度云账户' API_KEY = '这里填你自己的百度云账户' SECRET_KEY = '这里填你自己的百度云账户' #百度api识别key aipOcr = AipOcr(APP_ID, API_KEY, SECRET_KEY) with open('C:/Users/Administrator/Desktop/data/after cut/111.png','rb') as file: asdf=file.read() result = aipOcr.basicGeneral(asdf) word_list=result.get('words_result') question=[] #存放识别出来的题目 for i in word_list: question.append(i.get('words')) print(question) print('----------------识别成功------------------') if question[0]=="判断题": #如果题型是判断题, pd_a=806+40+(len(question)-3)*53 print('pd_a:',pd_a) pd_b=180+806+55+(len(question)-4)*53 print("pd_b:",pd_b) print('此题型为判断题!!!') print('pd_data:',pd_data) if pd_data==[]or pd_data==None: #如果数据库为空,后面for循环不会执行, print("数据库没有题目!") os.system(f'adb shell input tap 957 {pd_a}') #顶端到题目的距离(750)+题目到选项间的距离+选项框的一半高度+题目的行数*题目的高度 os.system("adb shell input tap 540 2048") time.sleep(3) #等待两秒 os.system('adb shell screencap -p /sdcard/111.png') os.system('adb pull /sdcard/111.png C:/Users/Administrator/Desktop/data/phone/111.png') img=Image.open('C:/Users/Administrator/Desktop/data/phone/111.png') #打开图片 if img.getpixel((484,650))==(245, 245, 245): #识别像素点若等于答案像素点,则判断正确 print("img.getpixel((484,650)",img.getpixel((484,650))) print("判断题选择正确,已自动记录答案1") question.append("a_coord") #在列表后追加答案 pd_data.append(question) return screen_phone() elif img.getpixel((484,650))==(245, 245, 245, 255): print("img.getpixel((484,650)",img.getpixel((484,650))) print("判断题选择正确,已自动记录答案2") question.append("a_coord") #在列表后追加答案 pd_data.append(question) return screen_phone() else: print("判断题选择错误,自动选择B") question.append("b_coord") pd_data.append(question
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。