Python改變生活 | OCR識別的花樣使用
這是Python改變生活系列的第四篇,在上文中講了一個需求的解決辦法,即用python識別條形碼來獲取快遞單號。
該問題我一共想了兩個方案,所以今天接著聊第二種解法。
前情提要
簡單的說,我們就是想把截圖文件中的快遞單號識別出來。

上一種方法將快遞單號提取了出來,這次我們希望能用OCR的方法將收件人與單號對應(yīng)提取。

OCR識別
利用Python進行精準文字的識別,我優(yōu)先推薦百度接口,具體配置步驟可以查看之前的文章。
配置成功后,可以得到AppID、API Key、Secret Key等關(guān)鍵信息。

百度OCR后返回的結(jié)果是一個列表。
一開始我嘗試對整張截圖進行識別,再選取結(jié)果列表中的元素。結(jié)果發(fā)現(xiàn)不同截圖返回的列表元素數(shù)量不一樣,也就是說我沒辦法固定獲得想要的值。
最后我又想到了一個折中的辦法:即先將截圖里的收件人和快遞單號部分截取成兩個圖片,再用百度接口分別識別這兩張圖片就好了。

所以我們只需要先構(gòu)建一個OCR識別單個文字塊的函數(shù)即可。
#你的 APPID AK SK
APP_ID = '22704919'
API_KEY = '1f2wAABTYBmXkbx1qXbPXDm0'
SECRET_KEY = '**************'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
#百度接口識別
def get_words_result(filePath):
image = open(filePath, 'rb')
image1 = image.read()
text_list = client.general(image1)
text_list = text_list['words_result'][0]['words']
image.close()
return text_list
后續(xù)等我們再裁剪了關(guān)鍵圖片,直接調(diào)用get_words_result()函數(shù)就可以識別對應(yīng)內(nèi)容。
裁剪圖片
裁剪圖片這里我使用的是PIL模塊,它是python中的第三方圖像處理庫,可以做很多和圖像處理相關(guān)的操作。

實現(xiàn)裁剪圖片,需要在使用時引用Image,使用Image中的open(file)方法可返回打開的圖片,再配合crop()函數(shù)即可進行裁剪。
crop([x1,y1,x2,y2])
crop里對應(yīng)的數(shù)值為該位置圖像在整體圖片中左上和右下兩個點的像素坐標
具體裁剪+識別語句如下所示:
def get_data(filePath):
img = Image.open(filePath)
ocr_results = []
basic_path = r"D:\python_code\條形碼\臨時"
crop_1 = img.crop((242,739,678,813)) #crop裁剪
crop_1.save(basic_path+"1.png")
crop_2 = img.crop((88,1052,229,1108)) #crop裁剪
crop_2.save(basic_path+"2.png")
for i in range(1, 3):
imgpath = basic_path + str(i) + '.png'
msg_info = get_words_result(imgpath) #調(diào)用函數(shù)識別文字
ocr_results.append(msg_info)
os.remove(imgpath) #刪除臨時裁剪的圖片
time.sleep(3)
return ocr_results
我在原文件夾中又新建了一個臨時文件夾"D:\python_code\條形碼\臨時",用來存放臨時裁剪的圖片12。然后調(diào)用ocr函數(shù)依次識別兩張圖片,并將結(jié)果存到列表ocr_results中。

最后,使用os模塊的remove()函數(shù)刪除本次臨時裁剪生成的兩張圖片。
批量識別
經(jīng)過前面的努力,批量識別簡直唾手可得。
還是先os遍歷圖片!這次不再涉及中文路徑問題,所以不需要改名操作。
#遍歷圖片
jpgs = []
path = os.getcwd()
for i in os.listdir(path): #獲取文件列表
jpgs.append(i)
#用于儲存識別結(jié)果
data_m = pd.DataFrame(columns=['expres','sname'])
#批量識別
for i in jpgs:
a = get_data(i)
data_m.loc[len(data_m)] = a
data_m
執(zhí)行!
當(dāng)當(dāng)當(dāng)!

如上圖所示,我們不僅將快遞單號識別了出來,與之對應(yīng)的收件人信息也被一應(yīng)取出??
對我來說,大大提升了工作效率。

小結(jié)
整個案例,我們共使用了兩種方法來解決問題,各自都有其優(yōu)缺點。
第一種,識別條形碼100%準確,但其只獲得了快遞單號。
第二種,識別文字有幾率出現(xiàn)問題,優(yōu)點是可以同時獲取對應(yīng)的收件人信息。
不過小五采用了裁剪關(guān)鍵圖片的方法,大大提升了OCR的精準度。最后我自己也是選擇了第二種方法,來方便給大家寄書后及時反饋快遞單號。

老鐵們,如果想看更多Python改變生活的真實問題案例,來給本文右下角點個贊吧??
