diff --git a/README.md b/README.md
index 5d91414..dd6b664 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,89 @@
-# test_cv2
+# Image Decode Implementation with CV2
+
+*author: Kaiyuan Hu, Rentong Guo*
+
+
+
+
+
+
+
+## Description
+
+An image decode 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..3254229
--- /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_decode_cv2 import ImageDecodeCV2
+
+
+# The factory method
+def test_cv2():
+ return ImageDecodeCV2()
diff --git a/image_decode_cv2.py b/image_decode_cv2.py
new file mode 100644
index 0000000..888e1f2
--- /dev/null
+++ b/image_decode_cv2.py
@@ -0,0 +1,60 @@
+# 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 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 ImageDecodeCV2(PyOperator):
+ @staticmethod
+ def _load_from_remote(image_url: str) -> np.ndarray:
+ try:
+ r = requests.get(image_url, timeout=(20, 20))
+ if r.status_code // 100 != 2:
+ log.error('Download image from %s failed, error msg: %s, request code: %s ',
+ image_url, r.text, r.status_code)
+ return None
+ arr = np.asarray(bytearray(r.content), dtype=np.uint8)
+ return cv2.imdecode(arr, -1)
+ except Exception as e:
+ log.error('Download image from %s failed, error msg: %s', image_url, str(e))
+ return False
+
+ @staticmethod
+ def _load_from_local(image_path: str) -> np.ndarray:
+ return cv2.imread(image_path)
+
+ def __call__(self, image_path: str):
+ if image_path.startswith('http'):
+ bgr_cv_image = ImageDecodeCV2._load_from_remote(image_path)
+ else:
+ bgr_cv_image = ImageDecodeCV2._load_from_local(image_path)
+ if bgr_cv_image is None:
+ err = 'Read image %s failed' % image_path
+ log.error(err)
+ raise RuntimeError(err)
+
+ rgb = cv2.cvtColor(bgr_cv_image, cv2.COLOR_BGR2RGB)
+ return Image(rgb, 'RGB')
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..bee4414
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,3 @@
+opencv-python
+requests
+numpy