admin管理员组文章数量:1654379
python的学习之路,第一篇博客
零基础自学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/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)
return restart()
for i in pd_data: #题库遍历对比
print("pd_data遍历的i:"
版权声明:本文标题:python用PIL、百度OCR、adb实现的手机自动答题辅助 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1729658974a1209489.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论