|
- import time
- import traceback
-
- import cv2
- from aip import AipOcr
- from loguru import logger
-
- from common.YmlConstant import get_baidu_ocr_APP_ID, get_baidu_ocr_API_KEY, get_baidu_ocr_SECRET_KEY
- from enums.BaiduSdkEnum import BAIDUERRORDATA
- from enums.ExceptionEnum import ExceptionType
- from exception.CustomerException import ServiceException
- from util.RWUtils import getConfigs
-
-
- class OcrBaiduSdk:
-
- __slots__ = [
- 'client', "__baidu_config"
- ]
-
- def __init__(self, base_dir):
- self.client = None
- self.__baidu_config = getConfigs(base_dir, 'config/dsp_baidu.json')
- self.init_client()
-
- def init_client(self):
- if self.client is None:
- self.client = AipOcr(str(self.__baidu_config["orc"]["APP_ID"]),
- self.__baidu_config["orc"]["API_KEY"],
- self.__baidu_config["orc"]["SECRET_KEY"])
-
- '''
- {
- "log_id": 2471272194,
- "words_result_num": 2,
- "words_result":
- [
- {"words": " TSINGTAO"},
- {"words": "青島睥酒"}
- ]
- }
- '''
-
- def universal_text_recognition(self, image, request_id):
- reply_num = 0
- reply_value = None
- while True:
- try:
- or_result, or_image = cv2.imencode(".jpg", image)
- options = {
- "language_type": "CHN_ENG",
- "detect_direction": "true",
- "detect_language": "true",
- "probability": "true"
- }
- res_image = self.client.basicGeneral(or_image.tobytes(), options)
- error_code = res_image.get("error_code")
- if error_code:
- enum = BAIDUERRORDATA.get(error_code)
- # 如果异常编码未知, 返回空值
- if enum is None:
- logger.error("百度云人流量统计异常!error_code:{}, request_id: {}", error_code, request_id)
- return None
- # 重试指定次数后,还是异常,输出统一内部异常
- if enum.value[3] == 0:
- if reply_value is None:
- reply_value = enum.value[4]
- logger.error("百度云人流量统计异常!error_code:{}, error_msg:{}, reply_num:{}, request_id: {}",
- enum.value[0], enum.value[2], reply_num, request_id)
- raise Exception()
- # 重试指定次数后,还是异常,输出对应的异常
- if enum.value[3] == 1:
- if reply_value is None:
- reply_value = enum.value[4]
- raise ServiceException(str(enum.value[0]), enum.value[2])
- # 重试指定次数后,还是异常,输出空
- if enum.value[3] == 2:
- if reply_value is None:
- reply_value = enum.value[4]
- if reply_num >= reply_value:
- return None
- raise Exception()
- return res_image
- except Exception as e:
- time.sleep(1)
- reply_num += 0.5
- self.init_client()
- if reply_num > reply_value:
- if isinstance(e, ServiceException):
- raise ServiceException(e.code, e.msg)
- logger.error("通用文字识别失败: {}, request_id: {}", traceback.format_exc(), request_id)
- raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
- ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
-
- '''
- {
- "log_id": 3583925545,
- "words_result": {
- "color": "blue",
- "number": "苏HS7766"
- }
- }
- '''
- def license_plate_recognition(self, image, request_id):
- reply_num = 0
- reply_value = None
- while True:
- try:
- or_result, or_image = cv2.imencode(".jpg", image)
- res_image = self.client.licensePlate(or_image.tobytes(), {"multi_detect": "true"})
- error_code = res_image.get("error_code")
- if error_code:
- enum = BAIDUERRORDATA.get(error_code)
- # 如果异常编码未知, 返回空值
- if enum is None:
- logger.error("百度云人流量统计异常!error_code:{}, request_id: {}", error_code, request_id)
- return None
- # 重试指定次数后,还是异常,输出统一内部异常
- if enum.value[3] == 0:
- if reply_value is None:
- reply_value = enum.value[4]
- logger.error("百度云人流量统计异常!error_code:{}, error_msg:{}, reply_num:{}, request_id: {}",
- enum.value[0], enum.value[2], reply_num, request_id)
- raise Exception()
- # 重试指定次数后,还是异常,输出对应的异常
- if enum.value[3] == 1:
- if reply_value is None:
- reply_value = enum.value[4]
- raise ServiceException(str(enum.value[0]), enum.value[2])
- # 重试指定次数后,还是异常,输出空
- if enum.value[3] == 2:
- if reply_value is None:
- reply_value = enum.value[4]
- if reply_num >= reply_value:
- return None
- raise Exception()
- return res_image
- except Exception as e:
- time.sleep(1)
- reply_num += 1
- self.init_client()
- if reply_num > reply_value:
- if isinstance(e, ServiceException):
- raise ServiceException(e.code, e.msg)
- logger.error("车牌识别失败: {}, request_id: {}", traceback.format_exc(), request_id)
- raise ServiceException(ExceptionType.SERVICE_INNER_EXCEPTION.value[0],
- ExceptionType.SERVICE_INNER_EXCEPTION.value[1])
|