2017-12-12 32 views
1

opencvで私のガラスに重なるアプリケーションを作成しようとしています。ただし、動画が表示されると、メガネはアルファ層に黒色を表示します。ここに私のコードです:pythonの黒いpngでopencvを使ったアルファブレンド

video_capture = cv2.VideoCapture(0) 
anterior = 0 
glasses = cv2.imread('Glasses_1.png') 

def put_glasses(glasses,fc,x,y,w,h): 

    face_width = w 
    face_height = h 

    glasses_width = int(face_width) 
    glasses_height = int(face_height*0.32857) 



    glasses = cv2.resize(glasses,(glasses_width,glasses_height)) 

    for i in range(glasses_height): 
     for j in range(glasses_width): 
      for k in range(3): 
       if glasses[i][j][k]<235: 

        fc[y+i-int(-0.25*face_height)-1][x+j][k] = glasses[i][j][k] 
    return fc 

while True: 
    if not video_capture.isOpened(): 
     print('Unable to load camera.') 
     sleep(5) 
     pass 
    ret, frame = video_capture.read() 
    if ret is True: 
     gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    else: 
     continue 

    faces = faceCascade.detectMultiScale(
     gray, 
     scaleFactor=1.1, 
     minNeighbors=5, 
     minSize=(40,40) 
    ) 
    for (x, y, w, h) in faces: 
     cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) 
     cv2.putText(frame,"Person Detected",(x,y),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2) 
     frame = put_glasses(glasses, frame, x, y, w, h) 

誰かが助けることができれば私は非常に感謝します。

+1

まず---ここだけの一般的なコメントが、あなたは本当にそのようなnumpyの配列をループする必要はありません。ルーピングなしで複数の値を一度に割り当てることができます。これははるかに高速です。あなたが質問した質問にWRT、アルファ層で何をしていますか? –

+0

私はアルファ層を捨てます、私はちょうど "メガネ"と間に何もしたくないです –

答えて

1

または変更されていない形式ではなく、bgr形式のpngを読んでください。それで、プログラムのあなたのガラスイメージが(h,w,4)の形であるとは思わない。フラグcv2.IMREAD_UNCHANGEDをお読みください。

glasses = cv2.imread("xxx.png", cv2.IMREAD_UNCHANGED)


たぶん、このリンクが役立ちます。 How do I clear a white background in OpenCV with c++?

BGRAワーム:

enter image description here

ブレンディング:

enter image description here

+0

私はこれを試しましたが、まだ黒で働いていません。 –

+0

@LaviniaPaganiniあなたのpngチャンネルをチェックしてもらえますか?特にアルファ。 – Silencer

+0

[OK]を確認しました。間違いは私が使っているイメージにありました:)ありがとう –

関連する問題