<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python改變生活 | OCR識別的花樣使用

          共 3275字,需瀏覽 7分鐘

           ·

          2021-05-25 16:06

          人生苦短,快學(xué)Python!

          這是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(13):
                  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改變生活的真實問題案例,來給本文右下角點個贊吧??

          瀏覽 79
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色美女操逼视频 | 久久激情精品 | 国模私拍一区二区三区 | 潮喷网站 | 中文字幕在线视频网站国产免费 |