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

标签 python image opencv

有没有办法快速绘制具有特定位置、大小和旋转的图像?假设我有一个框架,我想在它上面绘制一个带有某些变换的图像,我该怎么做呢?图像将有一个 alpha channel ,所以我不能直接复制它:

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 中使用任何快速的方法吗?如果没有,我应该如何实现?

最佳答案

由于似乎没有快速的方法来做到这一点,我创建了这个函数来实现这个效果:

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

关于python - 绘制具有特定位置、大小和旋转的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46614223/

相关文章:

python - 无法设置 pygame.Color 的 hsva/hsla 属性

python - 我应该使用 `import os.path` 还是 `import os` ?

javascript - 我如何在 react 中使用新的 Image()

opencv - cvRodrigues2 中雅可比矩阵的计算

java - 矩阵与浮点opencv android的乘法

python - 改变matplotlib histogram2d的高度范围

python - 使用 scikit-learn,如何在小数据集上学习 SVM?

python - 在 drawChessboardCorners 上使用排序函数时出现打印问题

image - 图案图像处理

javascript - 使用 javascript 径向排列图像的最有效方法是什么?