首頁 > 軟體

Python實現輕鬆識別數百個快遞單號

2022-06-29 14:03:04

大家好,我是小五

這是Python改變生活系列的第三篇,也是一個與你們有關的問題案例。

前情提要

瞭解我的小夥伴可能都知道,小五經常給大家送書。最近一年,不算聯合抽獎送書,單獨我自購+出版社贊助已送出1000本書籍。

如果是自購的話,還需要自己聯絡快速小哥寄出書籍。

寄出後快遞小哥會給我截圖來反饋,然而我想要單號的時候就遇到問題了。

每次寄完書,我都只能得到n個截圖(內含快遞資訊)。

為了及時反饋大家物流資訊,我需要儘快將快遞單號提取出來。

思考解決辦法

每次大概都有十幾到幾十張截圖,手動去識別真的太麻煩。

不如先看看每張截圖大概是什麼樣子,再去想想批次處理的辦法吧。

主要是為了批次獲取圖片中的快遞單號,我想到了兩個解決辦法:

  • 用python識別條形碼來直接獲得準確快遞單號
  • 用python呼叫ocr,識別截圖中的快遞單號文字

大家覺得哪個更簡單更準確呢?

今天我先聊聊第一種方法的流程和踩坑經歷。

遍歷圖片

首先,第一步需要先獲取資料夾中的所有截圖,再依次進行條形碼識別。

具體操作可以參考註釋

import os

def get_jpg():
    jpgs = []
    path = os.getcwd()
    for i in os.listdir(path):  #獲取檔案列表
        if i.split(".")[-1] == "jpg":  #篩選jpg檔案(截圖)
            oldname=os.path.join(path,i)  #舊檔名
            i = i.replace('微信圖片_','')
            newname=os.path.join(path,i)  #新檔名
            os.rename(oldname,newname)  #改名
            jpgs.append(i)
    return jpgs

上面的程式碼中除了遍歷篩選圖片,還涉及了改名的操作。

這是因為我在後面使用 opencv 時,開啟的路徑只要含有中文就會一直報錯,於是我就乾脆把截圖名稱裡的中文去除。

執行構建的get_jpg()函數,得到

這些就是演示檔案中的四個截圖檔案,下面開始對他們進行識別。

識別條形碼

python的第三方模組 pyzbar 可以很方便地處理二維條碼的識別。我們這次用它來識別一維條形碼的話,用法也大致一樣。不過還要搭配 cv2 使用,主要是為了利用cv2.imread()來讀取圖片檔案。

注意:對於cv2模組,安裝時需要輸入pip3 install opencv-python,但在匯入的時候採用import cv2

識別條形碼的具體語句如下所示:

import pyzbar.pyzbar as pyzbar
import cv2

def get_barcode(img):
    image = cv2.imread(img)
    barcodes = pyzbar.decode(image)
    barcode = barcodes[0]
    barcode_data = barcode.data.decode("utf-8")
    return barcode_data

上面構建的get_barcode()函數可以實現識別條形碼,並返回結果資料。

我們可以用for迴圈遍歷前文獲取的所有圖片,再依次使用get_barcode()函數來識別條形碼。

data_m =[]
for i in jpgs:
    data = get_barcode(i)
    data_m.append(data)
data_m

可以發現,成功識別了四張截圖裡的條形碼,並獲取了對應的快遞單號。

小結

回顧今天的問題案例,我先通過思考想出了兩種解決辦法。第一種的優點是識別條形碼比OCR更準確,但是其只獲取了快遞單號。後續在給獲得贈書的同學反饋時,我還需要手動將名字和單號對應,不夠偷懶。後續將給大家介紹第二種方法的流程和優缺點。

以上就是Python實現輕鬆識別數百個快遞單號的詳細內容,更多關於Python識別快遞單號的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com