Spaces:
Running
Running
import numpy as np | |
import PIL | |
import io | |
import cv2 | |
from base64 import b64decode, b64encode | |
def js_to_image(js_reply): | |
""" | |
Convert the JavaScript object into an OpenCV image. | |
@param js_reply: JavaScript object containing image from webcam | |
@return img: OpenCV BGR image | |
""" | |
# decode base64 image | |
image_bytes = b64decode(js_reply.split(',')[1]) | |
# convert bytes to numpy array | |
jpg_as_np = np.frombuffer(image_bytes, dtype=np.uint8) | |
# decode numpy array into OpenCV BGR image | |
img = cv2.imdecode(jpg_as_np, flags=1) | |
return img | |
def bbox_to_bytes(bbox_array): | |
""" | |
Convert OpenCV Rectangle bounding box image into base64 byte string to be overlayed on video stream. | |
@param bbox_array: Numpy array (pixels) containing rectangle to overlay on video stream. | |
@return bbox_bytes: Base64 image byte string | |
""" | |
# convert array into PIL image | |
bbox_PIL = PIL.Image.fromarray(bbox_array, 'RGBA') | |
iobuf = io.BytesIO() | |
# format bbox into png for return | |
bbox_PIL.save(iobuf, format='png') | |
# format return string | |
bbox_bytes = 'data:image/png;base64,{}'.format((str(b64encode(iobuf.getvalue()), 'utf-8'))) | |
return bbox_bytes | |
def image_to_bytes(image): | |
""" | |
Convert OpenCV image into base64 byte string to be overlayed on video stream. | |
@param image: Input image. | |
@return img_bytes: Base64 image byte string. | |
""" | |
ret, buffer = cv2.imencode('.jpg', image) | |
jpg_as_text = b64encode(buffer).decode('utf-8') | |
img_bytes = f'data:image/jpeg;base64,{jpg_as_text}' | |
return img_bytes |