util.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import cv2
  2. import numpy as np
  3. from typing import Union
  4. from flask import jsonify
  5. from random import randint
  6. from hmOCR import HuiMvOCR, Args
  7. from time import localtime, strftime
  8. __all__ = [
  9. "Response", "rand_str", "current_time", "get_ext_name", "is_image_ext",
  10. "str_include", "read_img", "crop_img", "rot_img", "save_img", "Engine"
  11. ]
  12. __StrBase = "qwertyuioplkjhgfdsazxcvbnm1234567890ZXCVBNMLKJHGFDSAQWERTYUIOP"
  13. __StrBaseLen = len(__StrBase) - 1
  14. __AcceptExtNames = ["jpg", "jpeg", "bmp", "png", "rgb", "tif", "tiff", "gif"]
  15. Engine = HuiMvOCR(Args())
  16. def Response(message: "str" = None, data=None):
  17. if message is None:
  18. return jsonify(success=True, message="操作成功", data=data)
  19. return jsonify(success=False, message=message, data=data)
  20. def rand_str(size: "int" = 8) -> "str":
  21. return "".join([__StrBase[randint(0, __StrBaseLen)] for _ in range(size)])
  22. def current_time() -> "str":
  23. return strftime("%Y-%m-%d_%H-%M-%S", localtime())
  24. def get_ext_name(name: "str") -> "str":
  25. return name.split(".")[-1].lower()
  26. def is_image_ext(ext: "str") -> bool:
  27. return ext in __AcceptExtNames
  28. def str_include(str_long: "str", str_short: "str") -> "bool":
  29. for it in str_short:
  30. if it not in str_long:
  31. return False
  32. return True
  33. def read_img(content: "str") -> "np.ndarray":
  34. return cv2.imdecode(np.frombuffer(content, np.uint8), 1) # noqa
  35. def crop_img(image: "np.ndarray") -> "np.ndarray":
  36. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # noqa 将图像转换为灰度图像
  37. _, threshold = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY) # noqa 换为二值图像 => save: [150,255]
  38. contours, _ = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # noqa 查找轮廓
  39. max_contour = max(contours, key=cv2.contourArea) # noqa 找到最大的轮廓
  40. rect = cv2.minAreaRect(max_contour) # noqa 计算最小外接矩形
  41. box = cv2.boxPoints(rect) # noqa 获取矩形的四个角点
  42. box = np.intp(box)
  43. # 裁剪图像
  44. return image[min(box[:, 1]):max(box[:, 1]), min(box[:, 0]):max(box[:, 0])]
  45. def rot_img(img: "np.ndarray") -> "list[np.ndarray]":
  46. return [img, np.rot90(img), np.rot90(img, 2), np.rot90(img, 3)]
  47. def save_img(filename: "str", content: "Union[bytes, np.ndarray]"):
  48. if isinstance(content, np.ndarray):
  49. return cv2.imwrite(filename, content) # noqa
  50. with open(filename, "wb") as fp:
  51. fp.write(content)
  52. fp.close()