先前在自己电脑上用c++实现了“基于百度API的OCR实现”,不得不说,那是一个痛苦的过程,配置libcurl库
openssl库等,配置完了之后才可以按照例程写代码,真的是非常麻烦,今天闲来无事,看到python实现比较简单,所以就考虑用python实现。关于c++实现的各类库,请移步:传送门
或者留言小哥,小哥发给你也可以~
因为我对例程进行了改进,最后的代码是利用opencv调用电脑摄像头,按下空格键捕获当前界面进行文字识别,按下esc按键退出程序
下面我们就步入今天的正题——python实现。
环境:win10、pycharm、python3.7.1
我们按照官方教程来逐渐配置:官方教程地址
对于官方教程前面的API文档等内容,看看就好,因为我先前用c++实现的时候已经了解过了,所以这里就直接上手,没有看文档。下面分几个步骤来实现。
调用百度API都需要在控制台注册ID,获得APPID AK SK。这样才能用接口。先在刚才那个官方教程的右上角点击:控制台:
接着在控制台页面选择 产品服务-文字识别,点击进入
进入之后,点击创建应用即可:
接着按照上面的要求填写即可获得APPID AK SK。
不像c++需要配置繁琐的库那样,python只需要用pip指令安装百度API即可:
具体做法是:win+R,输入cmd打开命令行窗口,输入pip回车查看是否已经安装pip指令,高版本的python已经自动安装pip,如果已经安装pip,输入指令之后会出现:
如果出现“不是内部或外部指令,也不是可运行的程序或批处理文件”,则说明没有安装pip,关于安装pip的教程请移步:win下pip安装教程。
安装好pip之后,按照教程 只需要 pip install baidu-aip 即可。如下图所示:
输入指令之后,会自动下载包并且安装,安装好之后如上图所示。其实到这里就已经完成了一大半,是不是很简单呀~
其实在这里还需要安装opencv,在开头就提到了opencv的用处,就是用来打开摄像头,这里直接在命令行窗口像安装百度api那样,直接:pip install opencv-python即可。如下图所示:
实际上这一步就是撸!代!码!这里就直接贴出来代码,代码里面有注释的~
import cv2
import time
from aip import AipOcr
""" 你的 APPID AK SK """
APP_ID = "你的APP ID"
API_KEY = "你的API KEY"
SECRET_KEY = "你的 SK"
#新建客户端
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
cap=cv2.VideoCapture(0)
while (1):
ret,frame=cap.read()
cv2.imshow("capture",frame)
if cv2.waitKey(1)& 0xFF==32: #按下空格键捕获当前画面
cv2.imwrite("test.jpg",frame) #将画面写入工程路径
image = get_file_content('test.jpg')#读取捕获的界面
""" 调用通用文字识别, 图片参数为本地图片 """
result_dict={} #新建一个空词典
# result_dict=client.basicGeneral(image)
""" 可选参数 支持中英文和方向检测 """
options = {}
options["language_type"] = "CHN_ENG"
options["detect_direction"] = "true"
options["detect_language"] = "true"
""" 带参数调用通用文字识别, 图片参数为本地图片 """
result_dict=client.basicGeneral(image, options)#返回结果是一个字典
# print(result_dict)
result_list=[] #新建一个提取结果的词典
result_list=result_dict["words_result"]
# print(result_list)
"""从列表中提取最终的结果"""
result_string=""
for item in result_list:
for str in item:
result_string=result_string+item[str]+" "
print(result_string)
"""按下esc退出"""
elif cv2.waitKey(10)& 0xFF==27 :
cap.release()
break;