绘制具有特定位置,大小和旋转的图像

时间:2017-10-06 21:35:08

标签: python image opencv

有没有办法快速绘制具有特定位置,大小和旋转的图像?假设我有一个框架,我想通过某些转换在其上绘制图像,我将如何去做?图像将有一个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使用任何快速方法吗?如果没有,我该如何实现呢?

1 个答案:

答案 0 :(得分: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)
)