목차
[Python]OpenCV 사람 얼굴 사진 겹치게 합성하기
이번 포스트에서는 파이썬 OpenCV를 사용해서 사람 얼굴이 있는 이미지 파일 2개를 열어서 한 얼굴에서 다른 얼굴로 그라데이션 처럼 천천히 바뀌는 예제를 구현할 것입니다.
이번 예제(Example)를 구현하기 위해서는 OpenCV 로 읽은 이미지 파일(Image file)은 픽셀값을 저장한 Numpy 행렬 형태라는 사실을 이해 해야 하고 두 이미지 사이에 픽셀 값에 Weighting을 주면서 점차적으로 바꿔야 한다는 원리를 이해하여야 합니다.
픽셀값(Pixel value)에 대한 설명은 아래 포스터에 잘되어 있으니 참조 하시길 바랍니다.
https://scribblinganything.tistory.com/493
다음으로 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)
'파이썬(Python) > opencv' 카테고리의 다른 글
[Python]OpenCV 3차원 이미지 스캔화면(2차원)처럼 바꾸기 (0) | 2022.04.05 |
---|---|
[Python]OpenCV 이미지 기울어지게 만들기, 원근감 주기(getPerspectiveTransform, warpPerspective) (0) | 2022.04.04 |
[Python]OpenCV 마우스 이벤트/클릭(Mouse Event, Click) 콜백함수 (0) | 2022.03.30 |
[Python]OpenCV 그림 영역 선택, 모자이크 처리하기(Image, Mosaic, Blur) (0) | 2022.03.28 |
[Python]OpenCV 이미지 마우스 클릭 좌표(위치) 값 확인(selectROI 함수) (0) | 2022.03.25 |