這個過程有點多,一步一步來。

一、文字識別

本人采用的是騰訊的云識別技術,所以先在騰訊完成一系列的注冊、申請工作。

首先打開騰訊云的官網:

點擊“入門”,這里面有大概需要的步驟:

開通文字識別的服務后:

這個按官方的說法是每個月可以免費使用1000次,還是很不錯的。

開通服務后,還需要訪問API的密鑰,這個也需要申請,我這個是已申請好的:

二、實現效果

一張圖片:

實現后的效果:

三、預安裝相應的包

首先,要安裝騰訊的組件包:-sdk-。直接在線安裝好像不得行,于是可以安裝離線版,我這里下載后再安裝的,包的名字叫:

pip hon-3.0.330-py2.py3-none-any.whl

然后還安裝了一個包:

pip -2.0.0-py2.py3-none-any.whl

這兩個包我已經上傳了:

我的機子只安裝了這兩個,如果控制臺有提示缺少包,可以自行再安裝。

四、實現

經過前面準備工作,下面把相應的代碼貼出來:

.py:

# -*- coding: utf-8 -*-
import sys
import ocr
import xlrd
import yaml_class
from xlutils.copy import copy
pic_path = sys.argv[1]
print('doing...',pic_path)
# 使用ocr進行轉換
config = yaml_class.get_yaml_data("config.yml")
trans = ocr.OCR()
path_excel = trans.img_to_excel(
    pic_path,
    image_path=pic_path,
    secret_id=config['secret_id'],
    secret_key=config['secret_key'],
)
old_excel = xlrd.open_workbook('output.xlsx')
new_excel = copy(old_excel)
ws = new_excel.get_sheet(0)
new_excel.save(pic_path+'.xls')

ocr.py:

# -*- coding: utf-8 -*-
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.ocr.v20181119 import ocr_client, models
import base64
# OCR識別封裝
class OCR(object):
    def img_to_excel(self,
                     output_file_name,
                     image_path,
                     secret_id,
                     secret_key):
        # 實例化一個認證對象,入參需要傳入騰訊云賬戶secretId,secretKey
        cred = credential.Credential(
            secret_id,
            secret_key
        )
        # 實例化client對象
        httpProfile = HttpProfile()
        httpProfile.endpoint = "ocr.tencentcloudapi.com"
        clientProfile = ClientProfile()
        clientProfile.httpProfile = httpProfile
        clientProfile.signMethod = "TC3-HMAC-SHA256"
        client = ocr_client.OcrClient(cred, "ap-shanghai", clientProfile)
        # 實例化一個請求對象
        req = models.GeneralFastOCRRequest()
        # 讀取圖片數據,使用Base64編碼
        with open(image_path, 'rb') as f:
            image = f.read()
            image_base64 = str(base64.b64encode(image), encoding='utf-8')
        req.ImageBase64 = image_base64
        # 通過client對象調用訪問接口,傳入請求對象
        resp = client.TableOCR(req)
        # 獲取返回數據(Data為Base64編碼后的Excel數據)
        data = resp.Data
        # 轉換為Excel
        output_file_name = str(output_file_name)
        path_excel = output_file_name+".xlsx"
        with open(path_excel, 'wb') as f:
            f.write(base64.b64decode(data))
        return path_excel

yaml讀取配置文件(.py):

# -*- coding: utf-8 -*-
import yaml
def get_yaml_data(yaml_file):
    # 打開yaml文件
    file = open(yaml_file, 'r', encoding="utf-8")
    file_data = file.read()
    file.close()
    # 將字符串轉化為字典或列表
    data = yaml.load(file_data)
    return data

.yml:

# -*- coding: utf-8 -*-
secret_id: AKIDPzLSHRK3bZUCSyCF3Z45Bj0LRHs0Ynzb
secret_key: Qa5QeYKwIQI4ZxDQFq663jIs********

雖然沒得講得很詳細,但基本步驟就是這些,這樣就可以利用騰訊的云服務,把圖片識別出來,再轉換成文件。

(2021.2.1更新)

上面ocr.py代碼更詳細的解釋,可以看官方的例子: / -sdk-

ocr.py是改裝的關鍵,所以最近又深入了解了一下,甚至可以看看源代碼:.py與.py源代碼

文字識別,也分很多種接口,通用文字、卡證文字、票據單據、汽車相關、行業文檔等多場景下的印刷體、手寫體文字識別:

每個人的需求不同,所以很有必要深入學習下。比如表格識別,就有兩個版本:

而我們上面的ocr.py采用的是V1版本,現在已經不推薦使用了,可以改成V2版本。V2版本的公共接口是,對應上面的代碼改動如下:

# 通過client對象調用訪問接口,傳入請求對象
resp = client.RecognizeTableOCR(req)

另外,還有一個比較關鍵的東西,那就是識別對象是哪種,印刷體,還是手寫體、英文體?上面的ocr.py用的是,即印刷體。

總的來說,ocr.py作用的就是通過識別印刷字體,然后通過轉換成表格。如果需要識別手寫體怎么辦?

需要修改.t:

# 實例化一個請求對象
req = models.GeneralHandwritingOCRRequest()
...
# 通過client對象調用訪問接口,傳入請求對象
resp = client.RecognizeTableOCR(req)
data = resp.Data

還有那個服務器地域,可以取以下值:

華北地區(北京)

ap-

華南地區(廣州)

ap-

港澳臺地區(中國香港)

ap-

亞太東北(首爾)

ap-

華東地區(上海)

ap-

亞太東南(新加坡)

ap-

北美地區(多倫多)

na-

也就是離哪個服務器近就選哪個。