因为它好像有这样做的没有快速的方法,我创造了这个函数来实现这种效果:
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)
)
pygame的和使用TKinter支持旋转。 – Prune
您可以使用[getRotationMatrix](http://docs.opencv.org/master/da/d54/group__imgproc__transform.html#gafbbc470ce83812914a70abfb604f4326)加上[warpAffine](http://docs.opencv.org/master/da/d54 /group__imgproc__transform.html#ga0203d9ee5fcd28d40dbc4a1ea4451983)旋转图像。在框架上粘贴旋转图像会更棘手....最简单的方法是使用旋转图像的alpha通道(实际图像上的255,旋转产生的背景上的0)并手动复制到框架中具有255个alpha通道的像素 – Miki