파이썬(Python)/opencv

[Python]OpenCV 사람 얼굴 사진 겹치게 합성하기, 겹치면서 사진 바꾸기

끄적끄적아무거나 2022. 4. 1. 19:05
반응형

 

목차

     

     

    [Python]OpenCV 사람 얼굴 사진 겹치게 합성하기

    이번 포스트에서는 파이썬 OpenCV를 사용해서 사람 얼굴이 있는 이미지 파일 2개를 열어서 한 얼굴에서 다른 얼굴로 그라데이션 처럼 천천히 바뀌는 예제를 구현할 것입니다. 

     

    이번 예제(Example)를 구현하기 위해서는 OpenCV 로 읽은 이미지 파일(Image file)은 픽셀값을 저장한 Numpy 행렬 형태라는 사실을 이해 해야 하고 두 이미지 사이에 픽셀 값에 Weighting을 주면서 점차적으로 바꿔야 한다는 원리를 이해하여야 합니다. 

     

    픽셀값(Pixel value)에 대한 설명은 아래 포스터에 잘되어 있으니 참조 하시길 바랍니다. 

     

    https://scribblinganything.tistory.com/493

     

    [Python]OpenCV 이미지 픽셀로 변경하여 수정하기(Numpy array)

    목차 OpenCV 이미지 픽셀(Pixel)값 확인하기 우리가 사용하는 컴퓨터의 이미지 파일은 아시다 시피 디지털(Digital)로 되어 있습니다. 화면으로 보이는 값은 실상 픽셀이라는 작은 단위를 BGR(Blue, Green,

    scribblinganything.tistory.com

     

     

    다음으로 weighting에 대해 설명하겠습니다. OpenCV는 이미지 파일의 BGR(Blue Green Red) 의 3가지 색상으로 표현을 하는데 0~255로 수치를 표기 합니다. 두개의 이미지 파일에서 동일 위치/Matrix에서 파란색(Blue) 값이 이미지1에서는 10이고 이미지2에서는 120이라고 할때 처음에 weigthing 값으로 1을 주고 아래와 같이 전개 하면 출력되는 값은 10이 됩니다. 

     

    10 x Weighting + 120 x (1-Weighting)

     

    다음으로 Weighting 값을 0.1씩 빼주면 120값이 점차적으로 영향을 주기 시작합니다. 이를 가중치(Weighting) 방법이라고 합니다.

     

    아래 예제를 보시면 쉽게 이해할 수 있습니다.

     

     

     

    [Python]OpenCV 사람 얼굴 사진 겹치게 합성 실습

     

    예제 코드>>

    import cv2
    import numpy as np
    
    img1 = cv2.imread('face1.jpg')
    img2 = cv2.imread('face2.jpg')
    
    print(img1.shape)
    print(img2.shape)
    
    weighting = 0
    
    while weighting <= 1:
        combined_img = img1 * weighting + img2 * (1-weighting)
        combined_img = combined_img.astype(np.uint8) 
        cv2.imshow("combined_img", combined_img)
        weighting = weighting + 0.02
        key = cv2.waitKey(20)
        if key == ord('s'): #stop
            break    
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    4~5번 라인: 겹칠 두개의 사진을 불러옵니다.

    7~8번 라인: 이미지 파일의 크기를 비교합니다. 자연스럽게 변경하기위해 동일한 사이즈를 사용했습니다.

    10번 라인: 시작 가중치 값을 0으로 시작합니다.

    12번 라인: 가중치 값이 1이상이 되면 종료 합니다.

    13번 라인: 두개의 이미지에 가중치를 주면서 합칩니다.

    14번 라인: 소수점으로 계산 했으므로 정수로 numpy 값을 변경해줍니다. (BGR 값)

    16번 라인: 가중치를 증가(Increment)합니다.

    17번 라인: 20ms 동안 키보드 입력을 기다립니다.

    18~19번 라인: s 키보드(Keyboard)를 입력하면 이미지 변환(Conversion)을 중단합니다.

     

     

    결과>>

    (853, 1280, 3)
    (853, 1280, 3)

     

    반응형