From 4158b9c77c1c8293d6994f29b3f80b779fc71444 Mon Sep 17 00:00:00 2001 From: wxywb Date: Fri, 8 Apr 2022 15:06:20 +0800 Subject: [PATCH] init repo. --- README.md | 89 ++++++++++++++++++++++++++++++++++++++++++++++- __init__.py | 20 +++++++++++ image_crop_cv2.py | 50 ++++++++++++++++++++++++++ 3 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 __init__.py create mode 100644 image_crop_cv2.py diff --git a/README.md b/README.md index 6ce4d89..085d05d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,89 @@ -# image-crop +# Image Crop Implementation with CV2 + +*author: David Wang* + + + +
+ + + +## Desription + +An image crop operator implementation with OpenCV. + + + +
+ + + +## Code Example + +Load a image from path './dog.jpg'. + + *Write the pipeline in simplified style:* + +```python +import towhee + +towhee.glob('./dog.jpg') \ + .image_decode.cv2() \ + .show() +``` + +*Write a same pipeline with explicit inputs/outputs name specifications:* + +```python +import towhee + +towhee.glob['path']('./dog.jpg') \ + .image_decode.cv2['path', 'img']() \ + .select['img']() \ + .show() +``` + + + + + + + +
+ + + +## Factory Constructor + +Create the operator via the following factory method + +***image_decode.cv2()*** + + + +
+ + + +## Interface + +An image decode operator takes an image path as input. It decodes the image back to ndarray. + + + +**Parameters:** + +**img**: *str* + +​ Image file path. + + + +**Returns**: *towhee.types.Image (a sub-class of numpy.ndarray)* + +​ The decoded image data as numpy.ndarray. + + + + diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e0001d4 --- /dev/null +++ b/__init__.py @@ -0,0 +1,20 @@ +# 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. + +from .image_crop_cv2 import ImageDecodeCV2 + + +# The factory method +def image_crop(clamp = False): + return ImageCropCV2(clamp) diff --git a/image_crop_cv2.py b/image_crop_cv2.py new file mode 100644 index 0000000..eb0e9c6 --- /dev/null +++ b/image_crop_cv2.py @@ -0,0 +1,50 @@ +# 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 + +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 + + @staticmethod + def _clamp(x, minimum, maximum) + return max(minimum, min(x, maximum)) + + def __call__(self, img: np.ndarray, bboxes: List[(int, int, int, int)]): + h, w, _ = img.shape + res = [] + for box in bboxes: + x1, y1, x2, y2 = box + x1 = ImageCropCV2._clamp(x1, 0, w) + x2 = ImageCropCV2._clamp(x2, 0, w) + y1 = ImageCropCV2._clamp(y1, 0, h) + y2 = ImageCropCV2._clamp(y2, 0, h) + res.append(Image[y1:y2,x1:x2,:]) + return res +