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

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

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

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

所以我們只需要先構(gòu)建一個(gè)OCR識(shí)別單個(gè)文字塊的函數(shù)即可。
#你的 APPID AK SK
APP_ID = '22704919'
API_KEY = '1f2wAABTYBmXkbx1qXbPXDm0'
SECRET_KEY = '**************'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
#百度接口識(shí)別
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ù)等我們?cè)俨眉袅岁P(guān)鍵圖片,直接調(diào)用get_words_result()函數(shù)就可以識(shí)別對(duì)應(yīng)內(nèi)容。
裁剪圖片
裁剪圖片這里我使用的是PIL模塊,它是python中的第三方圖像處理庫(kù),可以做很多和圖像處理相關(guān)的操作。

實(shí)現(xiàn)裁剪圖片,需要在使用時(shí)引用Image,使用Image中的open(file)方法可返回打開(kāi)的圖片,再配合crop()函數(shù)即可進(jìn)行裁剪。
crop([x1,y1,x2,y2])
crop里對(duì)應(yīng)的數(shù)值為該位置圖像在整體圖片中左上和右下兩個(gè)點(diǎn)的像素坐標(biāo)
具體裁剪+識(shí)別語(yǔ)句如下所示:
def get_data(filePath):
img = Image.open(filePath)
ocr_results = []
basic_path = r"D:\python_code\條形碼\臨時(shí)"
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ù)識(shí)別文字
ocr_results.append(msg_info)
os.remove(imgpath) #刪除臨時(shí)裁剪的圖片
time.sleep(3)
return ocr_results
我在原文件夾中又新建了一個(gè)臨時(shí)文件夾"D:\python_code\條形碼\臨時(shí)",用來(lái)存放臨時(shí)裁剪的圖片12。然后調(diào)用ocr函數(shù)依次識(shí)別兩張圖片,并將結(jié)果存到列表ocr_results中。

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

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

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

老鐵們,如果想看更多Python改變生活的真實(shí)問(wèn)題案例,來(lái)給本文右下角點(diǎn)個(gè)贊吧??
