2017-02-10 4 views
0

OpenCVで偽メガネ画像のパースペクティブを変更しようとしていますが、透明部分と不透明度が失われています。結果として生じるイメージには透明性がありません。 結果画像を別の画像にスタンプするためにパースペクティブを変更したいと思います。透明画像のOpenCV warpPerspectiveでの問題

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のflagsパラメータがIMREAD_COLORに設定されています。 the documentationによれば、これはあなたがアルファ面を含め、正しく、この変更により画像の負荷をIMREAD_UNCHANGED

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

を使用する必要があり、その代わり

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

を意味します。

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

変換されたイメージを別のイメージにスタンプする方法はありますか? 私はcv2.warpPerspectiveでそれをしようとしていますが、私はその点に到達できません。 'final_image = cv2.warpPerspective(メガネ、M、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