2017-10-06 59 views
0

是否有方法可以快速繪製具有特定位置,大小和旋轉的圖像?假設我有一個框架,並且我想通過某些轉換在其上繪製圖像,那麼我將如何去做呢?圖像將有一個alpha通道,所以我不能直接複製它:繪製具有特定位置,大小和旋轉的圖像

image = # a loaded image 
x, y, w, h = # some values 

# resize 
cv2.resize(image, (w, h)) 
# rotation 
# ??? 
frame[y:y+h,x:x+w] = image 

這也不適用旋轉。

是否有任何可以從OpenCV使用的快速方法?如果不是,我應該如何實施?

+0

pygame的和使用TKinter支持旋轉。 – Prune

+0

您可以使用[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

回答

2

因爲它好像有這樣做的沒有快速的方法,我創造了這個函數來實現這種效果:

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) 
)