# Copyright 2021 Zilliz. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import logging import cv2 import requests import numpy as np from typing import List, Tuple from towhee import register from towhee.operator import PyOperator, OperatorFlag from towhee._types import Image log = logging.getLogger() @register(output_schema=['img'], flag=OperatorFlag.STATELESS | OperatorFlag.REUSEABLE) class ImageCropCV2(PyOperator): def __init__(self, clamp = False): self.clamp = clamp self.h = None self.w = None @staticmethod def _clamp(x, minimum, maximum): return max(minimum, min(x, maximum)) def get_box(self, img, box): x1, y1, x2, y2 = box x1 = ImageCropCV2._clamp(x1, 0, self.w) x2 = ImageCropCV2._clamp(x2, 0, self.w) y1 = ImageCropCV2._clamp(y1, 0, self.h) y2 = ImageCropCV2._clamp(y2, 0, self.h) return img[y1:y2,x1:x2,:] def __call__(self, img: np.ndarray, bboxes: List[Tuple]): self.h, self.w, _ = img.shape res = [] try: res.append(self.get_box(img, bboxes)) except: for box in bboxes: res.append(self.get_box(img, box)) return res