由于似乎没有快速的方法,我创建了这个函数来实现这个效果:
import numpy as np
import imutils
import cv2
def draw(frame, image, location, dimension, rotation=0):
w, h = dimension # dimension
x, y = location # center
fh, fw = frame.shape[:2] # frame size
image = cv2.resize(image, (w, h)) # resize image
image = imutils.rotate_bound(image, rotation) # rotate image
nh, nw = image.shape[:2]
tlx, tly = x - nw / 2, y - nh / 2 # top left
if tlx < 0:
# x left out of bound
offset = (0 - tlx)
nw -= offset
tlx = 0
image = image[:,offset:,:]
if tlx + nw >= fw:
# x right out of bound
offset = (tlx + nw - fw)
nw -= offset
image = image[:,:nw,:]
if tly < 0:
# y left out of bound
offset = (0 - tly)
nh -= offset
tly = 0
image = image[offset:,:,:]
if tly + nh >= fh:
# y right out of bound
offset = (tly + nh - fh)
nh -= offset
image = image[:nh,:,:]
overlay_img = image[:,:,:3] # RGB channel
overlay_alpha = cv2.split(image)[3] # alpha channel
res, overlay_is_alpha = cv2.threshold(overlay_alpha, 10, 1, cv2.THRESH_BINARY_INV) # 1 if alpha, 0 if not
res, overlay_is_not_alpha = cv2.threshold(overlay_alpha, 10, 1, cv2.THRESH_BINARY) # 0 if alpha, 1 if not
overlay_is_alpha = np.repeat(overlay_is_alpha, 3).reshape((nh,nw,3)) # expand to all 4 channels
overlay_is_not_alpha = np.repeat(overlay_is_not_alpha, 3).reshape((nh,nw,3))
overlay_img *= overlay_is_not_alpha # mask out alpha pixels
frame[tly:tly+nh, tlx:tlx+nw] *= overlay_is_alpha # mask out non alpha pixels
frame[tly:tly+nh, tlx:tlx+nw] += overlay_img # combine
draw(
bg, # background image in BGR
image, # image to be drawn in BGRA
location, # center (x,y)
dimension, # size (w,h)
degree # rotation (deg)
)