前人栽樹後人乘涼,以不造輪子為由
使用百度的圖片識字功能,實現了一個上萬次使用量的指令碼。
系統:win10
Python版本:python3.8.6
pycharm版本:pycharm 2021.1.2(Professional Edition)
完整程式碼下載:
一、獲取百度智慧雲token
百度智慧雲 登入後找到人工智慧介面下的文字識別->管理介面建立應用文字識別。
建立應用完成後記錄下,後臺介面提供的AppID、API key、Secret Key的資訊
接下來根據 官方提供的文件獲取使用Token
# encoding:utf-8 import requests # client_id 為官網獲取的AK, client_secret 為官網獲取的SK host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=wgEHks0l6MCpalbs3lPuFX1U&client_secret=Z4Rn4ghBx9k06fUYPmSEIRbCFvWFxLyQ' response = requests.get(host) if response: print(response.json()['access_token'])
二、百度藉口呼叫
使用獲取後token呼叫百度介面對圖片進行識別提取文字
# encoding:utf-8 import requests import base64 ''' 通用文字識別(高精度版) ''' request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic" # 二進位制方式開啟圖片檔案 f = open('圖片.png', 'rb') img = base64.b64encode(f.read()) params = {"image":img} # 獲取後的Token的呼叫 access_token = '24.0d99efe8a0454ffd8d620b632c58cccc.2592000.1639986425.282335-24065278' request_url = request_url + "?access_token=" + access_token headers = {'content-type': 'application/x-www-form-urlencoded'} response = requests.post(request_url, data=params, headers=headers) if response: print (response.json())
獲取後的token為json格式的資料
此處步驟我們可以看出識別後的檔案是以json的格式返回的所以要想達到取出文字的效果就需要對json格式的返回值進行解析
三、搭建視窗化的程式以便於使用
實現視窗視覺化的第三方類庫是Tkinter。可在終端輸入 pip install tkinter 自行下載安裝
匯入tkinter模組包 構建我們的視覺化視窗,要是實現的功能有截圖識別文字,中英文分離,文字識別後自動傳送給剪下板
from tkinter import * # 建立視窗 window = Tk() # 視窗名稱 window.title('qcc-tnw') # 設定視窗大小 window.geometry('400x600') # 視窗標題設定 l=Label(window,text='百度API呼叫', bg='green', fg='white', font=('Arial', 12), width=30, height=2) l.pack() # 設定文字接收框 E1 = Text(window,width='100',height='100') # 設定操作Button,單擊執行文字識別 "window視窗,text表示按鈕文字,font表示按鈕本文字型,width表示按鈕寬度,height表示按鈕高度,command表示執行的函式" img_txt = Button(window, text='文字識別', font=('Arial', 10), width=15, height=1) # 設定操作Button,單擊分割英文 cut_en = Button(window, text='英文分割', font=('Arial', 10), width=15, height=1) # 設定操作Button,單擊分割中文 cut_cn = Button(window, text='中文分割', font=('Arial', 10), width=15, height=1) # 引數anchor='nw'表示在視窗的北偏西方向即左上角 img_txt.pack(anchor='nw') cut_en.pack(anchor='nw') cut_cn.pack(anchor='nw') # 使得構建的視窗始終顯示在桌面最上層 window.wm_attributes('-topmost',1) window.mainloop()
四、實現截圖的自動儲存
通過上述對百度介面的解析發現介面是不支援提取剪下板中的檔案的
所以通過PIL庫擷取的圖片從剪下板儲存到本地,在呼叫百度的介面實現圖片中文字的識別
PIL的安裝 終端輸入 pip install PIL
from PIL import ImageGrab #取出剪下板的檔案儲存至本地 image = ImageGrab.grabclipboard() s= 'xxx.png' image.save(s) #百度介面呼叫 request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic" f = open(s, 'rb') img = base64.b64encode(f.read()) params = {"image": img} access_token = '24.ee0e97cbc00530d449464a563e628b8d.2592000.1640228774.282335-24065278' request_url = request_url + "?access_token=" + access_token headers = {'content-type': 'application/x-www-form-urlencoded'} response = requests.post(request_url, data=params, headers=headers) for i in response.json()['words_result']: print(i['words'])
完成後可以使用qq或微信等的截圖功能截圖並執行程式
五、將識別到的文字輸出顯示在視窗文字框中並將文字傳送到剪下板
if response: for i in response.json()['words_result']: # 接受識別後的文字 E1.insert("insert", i['words'] + '\n') E1.pack(side=LEFT) # 將識別後的文字寫入剪下板 pyperclip.copy(E1.get("1.0","end"))
六、提取識別後文字中的中(英)文
此處的判斷相對簡單將 if len(''.join(re.findall(r'[A-Za-z]', i['words'])))<1: 中的‘<’改為‘>’即為中文
E1.delete('1.0','end') for i in response.json()['words_result']: #判斷是否存在英文 if len(''.join(re.findall(r'[A-Za-z]', i['words'])))<1: #將識別正則過濾後的文字在文字框中顯示 E1.insert("insert", i['words'] + '\n') E1.pack(side=LEFT) #複製到剪下板 pyperclip.copy(E1.get("1.0", "end"))
最後將方法封裝為函式形式傳遞至我們定義好的視窗按鈕中
# 設定操作Button,單擊執行文字識別 "window視窗,text表示按鈕文字,font表示按鈕本文字型,width表示按鈕寬度,height表示按鈕高度,command表示執行的函式" img_txt = Button(window, text='文字識別', font=('Arial', 10), width=15, height=1,command=img_all) # 設定操作Button,單擊分割英文 cut_en = Button(window, text='英文分割', font=('Arial', 10), width=15, height=1,command=img_en) # 設定操作Button,單擊分割中文 cut_cn = Button(window, text='中文分割', font=('Arial', 10), width=15, height=1,command=img_cn) # 引數anchor='nw'表示在視窗的北偏西方向即左上角 img_txt.pack(anchor='nw') cut_en.pack(anchor='nw') cut_cn.pack(anchor='nw') window.wm_attributes('-topmost',1)