2017-12-12 59 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와 배열을 통해 루프 필요가 없습니다 . 반복하지 않고 한 번에 여러 값을 지정할 수 있으며 훨씬 더 빠릅니다. WRITE 질문 : 알파 레이어로 어디에서 무엇을하고 있습니까? –

+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

확인되었습니다. 실수는 내가 사용하고있는 이미지에있었습니다 :) 감사합니다. –