2017-02-10 200 views
0

我試圖用OpenCV更改假眼鏡圖像的透視圖,但透明部分和不透明度會丟失。生成的圖像沒有透明膠片。 我想更改視角以便將生成的圖像印到另一幅圖像上。OpenCV warp問題與透明圖像

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

你錯誤地加載圖像,滴透明層。這很容易驗證 - 加載後打印圖像的形狀。

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

如果未指定,的imread標誌參數設置爲IMREAD_COLOR。根據the documentation這意味着

If set, always convert image to the 3 channel BGR color image.

相反,你應該正確使用IMREAD_UNCHANGED

If set, return the loaded image as is (with alpha channel, otherwise it gets cropped).

隨着這一變化,加載圖像,包括α平面。

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

有沒有辦法將轉換後的圖像「印」到另一張圖像中? 我試圖用cv2.warpPerspective來做,但我無法做到這一點。 應該是這樣的: 'final_image = cv2.warpPerspective(眼鏡,男,RES_SIZE,face_image,borderMode = cv2.BORDER_TRANSPARENT)' – xabi

+0

見[此答案](http://stackoverflow.com/a/37198079/ 3962537)。 –

+0

ValueError:操作數無法與形狀一起廣播(614,500,3)(640,500,3) – xabi