from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
# 導入對應產品模塊的 client models。
from tencentcloud.common.profile.client_profile import ClientProfile
import base64
def get_base64(img_dir):
with open(img_dir, 'rb') as f:
base64_data = base64.b64encode(f.read())
base64_code = base64_data.decode()
return base64_code
def img_ocr(img_url, secretId, secretKey, ifurl=False, tryagain=0):
from tencentcloud.ocr.v20181119 import ocr_client, models
try:
clientProfile = ClientProfile()
clientProfile.signMethod = "TC3-HMAC-SHA256"
cred = credential.Credential(secretId, secretKey)
client = ocr_client.OcrClient(cred, "ap-guangzhou", clientProfile)
req = models.GeneralFastOCRRequest()
if ifurl:
req.ImageUrl = img_url
else:
req.ImageBase64 = get_base64(img_url)
resp = client.GeneralFastOCR(req)
return resp
except TencentCloudSDKException as err:
if '照片中未檢測到文本' in err.message:
return None
# 若是api調用失敗失敗了,再嘗試5次
if tryagain<1:
return img_ocr(img_url, secretId, secretKey, tryagain=tryagain+1)
else:
return None
def merge_ocr_result(resp, area_threshold=500):
# 過濾小面積字體+合併所有檢測到的文本
img_ocr_res = ''
for text in resp.TextDetections:
width = text.Polygon[2].X-text.Polygon[0].X
height = text.Polygon[2].Y-text.Polygon[0].Y
area = width*height
if area>=area_threshold:
img_ocr_res += text.DetectedText
if img_ocr_res == '':
return None
return img_ocr_res
def get_ocr_result(img_url, secretId, secretKey, ifurl=False):
resp = img_ocr(img_url, secretId, secretKey, ifurl=ifurl)
if resp:
img_ocr_res = merge_ocr_result(resp)
else:
img_ocr_res = None
return img_ocr_res
if __name__ == '__main__':
img_url = 'D:/1.jpg'
secretId = ''
secretKey = ''
print(get_ocr_result(img_url, secretId, secretKey, ifurl=False))
img_url
填入圖片的url或者本地地址
ifurl
如果圖片是url形式的話,選擇True
,如果是圖片本地地址的話,選擇False
secretId
、secretKey
在這裏看自己的Id和Key:https://console.cloud.tencent.com/cam/capi
P.S. 可以改爲,判斷之前是否有讀過這個圖片,如果讀過的話,直接讀取之前保存的內容,如果沒讀過的話,再調用API
佔坑:每次調用都保存下來,下一次優先判斷是否已保存過,若是則直接讀取txt,減少耗時