code: def getDetBoxes_core(
      textmap,
      linkmap,
      text_threshold,
      link_threshold,
      low_text,
      estimate_num_chars=False,
  ):
      # prepare data
      linkmap = linkmap.copy()
      textmap = textmap.copy()
      img_h, img_w = textmap.shape
  
      """ labeling method """
      ret, text_score = cv2.threshold(textmap, low_text, 1, 0)
      ret, link_score = cv2.threshold(linkmap, link_threshold, 1, 0)
  
      text_score_comb = np.clip(text_score + link_score, 0, 1)
      (
          nLabels,
          labels,
          stats,
          centroids,
      ) = cv2.connectedComponentsWithStats(
          text_score_comb.astype(np.uint8), connectivity=4
      )
  
      det = []
      mapper = []
      for k in range(1, nLabels):
          # size filtering
          size = stats[k, cv2.CC_STAT_AREA]
          if size < 10:
              continue
  
          # thresholding
          if np.max(textmap[labels == k]) < text_threshold:
              continue
  
          # make segmentation map
          segmap = np.zeros(textmap.shape, dtype=np.uint8)
          segmap[labels == k] = 255
          if estimate_num_chars:
              _, character_locs = cv2.threshold(
                  (textmap - linkmap) * segmap / 255.0,
                  text_threshold,
                  1,
                  0,
              )
              _, n_chars = label(character_locs)
              mapper.append(n_chars)
          else:
              mapper.append(k)
          segmap[
              np.logical_and(link_score == 1, text_score == 0)
          ] = 0  # remove link area
          x, y = stats[k, cv2.CC_STAT_LEFT], stats[k, cv2.CC_STAT_TOP]
          w, h = (
              stats[k, cv2.CC_STAT_WIDTH],
              stats[k, cv2.CC_STAT_HEIGHT],
          )
          niter = int(math.sqrt(size * min(w, h) / (w * h)) * 2)
          sx, ex, sy, ey = (
              x - niter,
              x + w + niter + 1,
              y - niter,
              y + h + niter + 1,
          )
          # boundary check
          if sx < 0:
              sx = 0
          if sy < 0:
              sy = 0
          if ex >= img_w:
              ex = img_w
          if ey >= img_h:
              ey = img_h
          kernel = cv2.getStructuringElement(
              cv2.MORPH_RECT, (1 + niter, 1 + niter)
          )
          segmap[sy:ey, sx:ex] = cv2.dilate(
              segmap[sy:ey, sx:ex], kernel
          )
  
          # make box
          np_contours = (
              np.roll(np.array(np.where(segmap != 0)), 1, axis=0)
              .transpose()
              .reshape(-1, 2)
          )
          rectangle = cv2.minAreaRect(np_contours)
          box = cv2.boxPoints(rectangle)
  
          # align diamond-shape
          w, h = np.linalg.norm(box[0] - box[1]), np.linalg.norm(
              box[1] - box[2]
          )
          box_ratio = max(w, h) / (min(w, h) + 1e-5)
          if abs(1 - box_ratio) <= 0.1:
              l, r = min(np_contours[:, 0]), max(np_contours[:, 0])
              t, b = min(np_contours[:, 1]), max(np_contours[:, 1])
              box = np.array(
                  [[l, t], [r, t], [r, b], [l, b]], dtype=np.float32
              )
  
          # make clock-wise order
          startidx = box.sum(axis=1).argmin()
          box = np.roll(box, 4 - startidx, 0)
          box = np.array(box)
  
          det.append(box)
  
      return det, labels, mapper
  
file_path: EasyOCR/easyocr/craft_utils.py
imports: import numpy
  import cv2
  import math
  from scipy.ndimage import label
label_desc: Use image node_id 2 for calling a global function with example usage: getDetBoxes_core(textmap, linkmap, text_threshold, link_threshold, low_text, estimate_num_chars) and returns: det,  labels,  mapper