因爲它好像有這樣做的沒有快速的方法,我創造了這個函數來實現這種效果:
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