【问题标题】:Problems with OpenCV warpPerspective with transparent images带有透明图像的 OpenCV warpPerspective 问题
【发布时间】:2017-06-28 16:47:18
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

    标签: python opencv transparency


    【解决方案1】:

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

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

    如果不指定,imread 的标志参数设置为IMREAD_COLOR。根据the documentation,这意味着

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

    您应该使用IMREAD_UNCHANGED

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

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

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

    【讨论】:

    • 有没有办法将转换后的图像“标记”成另一个图像?我正在尝试使用 cv2.warpPerspective 来做到这一点,但我无法直截了当。应该是这样的:final_image = cv2.warpPerspective(glasses, M, RES_SIZE, face_image, borderMode=cv2.BORDER_TRANSPARENT)
    • ValueError: 操作数无法与形状一起广播 (614,500,3) (640,500,3)
    • 这是我的代码:link
    • 关闭但没有雪茄 :) ... 现在图像已混合,但颜色错误。眼镜是红色的,但混合的是黑色link
    • @xabi 奇怪,这个variant of your script 在我的机器上产生this result(OpenCV 2.4.11 和 3.1.0 都试过)。
    猜你喜欢
    • 2013-01-19
    • 2014-03-26
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多