使用透明图像的OpenCV warpPerspective问题

时间:2017-02-10 10:56:28

标签: python opencv transparency

我正试图用OpenCV改变假眼镜图像的视角,但透明部分和不透明度会丢失。生成的图像没有透明度。 我想更改透视图,以便将生成的图像标记在另一个图像上。

我可以使用OpenCV吗?

#!/usr/bin/python
import numpy as np
import cv2

glasses = cv2.imread('fake_glasses.png')

RES_SIZE = (500,640)

pts1 = np.float32([[  0,  0], [599,  0],
                   [  0,208], [599,208]])
pts2 = np.float32([[ 94,231], [354,181],
                   [115,316], [375,281]])

M = cv2.getPerspectiveTransform(pts1,pts2)

rotated = cv2.warpPerspective(glasses, M, RES_SIZE)
cv2.imwrite("rotated_glasses.png", rotated)

fake_glasses.png (with transparent parts

mask.png

1 个答案:

答案 0 :(得分:2)

您正在正确加载图像,丢弃透明层。这很容易验证 - 加载后打印图像的形状。

>>> img1 = cv2.imread('fake_glasses.png')
>>> print(img1.shape)
(209, 600, 3)

如果未指定,imread的flags参数将设置为IMREAD_COLOR。根据{{​​3}},这意味着

  

如果设置,请始终将图像转换为3通道BGR彩色图像。

相反,您应该使用IMREAD_UNCHANGED

  

如果设置,则按原样返回加载的图像(使用Alpha通道,否则会被裁剪)。

通过此更改,图像可以正确加载,包括alpha平面。

>>> img2 = cv2.imread('fake_glasses.png', cv2.IMREAD_UNCHANGED)
>>> print(img2.shape)
(209, 600, 4)