docstr: img_height, img_width = img.shape[0:2]
  left = int(np.min(points[:, 0]))
  right = int(np.max(points[:, 0]))
  top = int(np.min(points[:, 1]))
  bottom = int(np.max(points[:, 1]))
  img_crop = img[top:bottom, left:right, :].copy()
  points[:, 0] = points[:, 0] - left
  points[:, 1] = points[:, 1] - top
docstr_tok: ["img_height",",","img_width","=","img.shape","[","0:2","]","left","=","int","(","np.min","(","points","[",":",",","0","]",")",")","right","=","int","(","np.max","(","points","[",":",",","0","]",")",")","top","=","int","(","np.min","(","points","[",":",",","1","]",")",")","bottom","=","int","(","np.max","(","points","[",":",",","1","]",")",")","img_crop","=","img","[","top",":","bottom",",","left",":","right",",",":","]",".copy","(",")","points","[",":",",","0","]","=","points","[",":",",","0","]","-","left","points","[",":",",","1","]","=","points","[",":",",","1","]","-","top"]
code: def get_rotate_crop_image(self, img, points):
      """
      img_height, img_width = img.shape[0:2]
      left = int(np.min(points[:, 0]))
      right = int(np.max(points[:, 0]))
      top = int(np.min(points[:, 1]))
      bottom = int(np.max(points[:, 1]))
      img_crop = img[top:bottom, left:right, :].copy()
      points[:, 0] = points[:, 0] - left
      points[:, 1] = points[:, 1] - top
      """
      img_crop_width = int(
          max(
              np.linalg.norm(points[0] - points[1]),
              np.linalg.norm(points[2] - points[3]),
          )
      )
      img_crop_height = int(
          max(
              np.linalg.norm(points[0] - points[3]),
              np.linalg.norm(points[1] - points[2]),
          )
      )
      pts_std = np.float32(
          [
              [0, 0],
              [img_crop_width, 0],
              [img_crop_width, img_crop_height],
              [0, img_crop_height],
          ]
      )
      M = cv2.getPerspectiveTransform(points, pts_std)
      dst_img = cv2.warpPerspective(
          img,
          M,
          (img_crop_width, img_crop_height),
          borderMode=cv2.BORDER_REPLICATE,
          flags=cv2.INTER_CUBIC,
      )
      dst_img_height, dst_img_width = dst_img.shape[0:2]
      if dst_img_height * 1.0 / dst_img_width >= 1.5:
          dst_img = np.rot90(dst_img)
      return dst_img
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import argparse
  import ast
  import copy
  import math
  import os
  import time
  import cv2
  import numpy
  import paddle
  from chinese_ocr_db_crnn_server.character import CharacterOps
  from chinese_ocr_db_crnn_server.utils import base64_to_cv2
  from chinese_ocr_db_crnn_server.utils import draw_ocr
  from chinese_ocr_db_crnn_server.utils import get_image_ext
  from chinese_ocr_db_crnn_server.utils import sorted_boxes
  from paddle.inference import Config
  from paddle.inference import create_predictor
  from PIL import Image
  import paddlehub
  from paddlehub.module.module import moduleinfo
  from paddlehub.module.module import runnable
  from paddlehub.module.module import serving
  from paddlehub.utils.log import logger
label_desc: Use image node_id 5 for calling the ChineseOCRDBCRNNServer obj's underlying member method code with example usage: obj.get_rotate_crop_image(img, points) and returns: dst_img