반응형
황선규 박사님의 <OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝>, OpenCV 강의를 공부한 내용을 정리했습니다.
크로마 키 합성하기
크로마 키(Chroma key) 합성이란 녹색 또는 파란색 배경에서 찰영한 영상에 다른 배경 영상을 합성하는 기술입니다.
뉴스, 유튜브, 트위치 방송에서 많이 이용되는 기법입니다.
파이썬 OpenCV 라이브러리를 활용해서 크로마 키 합성을 해보겠습니다.
준비물은 녹색 배경의 영상, 합성할 배경 영상이 필요합니다.
1. 녹색 스크린 영역 추출하기 - cv2.inRange
크로마 키 영상을 BGR -> HSV 색 공간으로 변환합니다.
cv2.inRange() 함수에 대한 설명은 여기에서 확인할 수 있습니다.
cv2.inRange() 함수를 사용하여 50 < H < 80, 150 < S < 255, 0 < V < 255 범위의 영역을 검출하여 마스크 영상을 만들겠습니다.
# HSV 색 공간에서 녹생 영역을 검출
hsv = cv2.cvtColor(frame1, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, (50, 150, 0), (70, 255, 255))
2. 녹색 영역에 다른 배경 영상을 합성하기 - cv2.copyTo
마스크 연산을 지원하는 cv2.copyTo() 함수를 사용해서 녹색 영역에 다른 배경 영상을 합성합니다.
cv2.copyTo() 함수에 대한 설명은 여기에서 확인할 수 있습니다.
# 녹색 영역에 다른 영역 배경을 합성하기
cv2.copyTo(frame2, mask, frame1)
3. 크로마 키 합성 코드
위에서 설명한 방법을 활용해서 크로마 키 합성 영상을 구현해보겠습니다.
녹색 배경 영상이 출력되고 스페이스바를 누르면 크로마 키 합성된 영상이 출력됩니다.
또 스페이스바를 누르면 녹색 배경 영상이 출력됩니다.
# 녹색 배경 동영상 불러오기
cap1 = cv2.VideoCapture('woman.mp4')
if not cap1.isOpened():
print('video open failed!')
sys.exit()
# 비 오는 배경 동영상 불러오기
cap2 = cv2.VideoCapture('raining.mp4')
if not cap2.isOpened():
print('video open failed!')
sys.exit
# 두 동영상의 크기, FPS는 같다고 가정
w = round(cap1.get(cv2.CAP_PROP_FRAME_WIDTH))
h = round(cap1.get(cv2.CAP_PROP_FRAME_HEIGHT))
frame_cnt1 = round(cap1.get(cv2.CAP_PROP_FRAME_COUNT))
frame_cnt2 = rount(cap1.get(cv2.CAP_PROP_FRAME_COUNT))
fps = round(cap1.get(cv2.CAP_PROP_FPS))
# 프레임 간 시간 간격 설정
delay = int(1000 / fps)
# 합성 여부 플래그
do_composit = False # False 면 합성을 안함. True면 크로마키 합성
# 전체 동영상 재생
while True: # 무한 루프
ret1, frame1 = cap1.read() # 녹색 배경 영상 읽어오기
if not ret1: # 영상1 프레임이 끝나면 종료
break
# do_composit 플래그가 True일 때에만 합성
if do_composit:
ret2, frame2 = cap2.read() # 비 오는 영상 읽어오기
if not ret2: #영상 2 프레임이 끝나면 종료
break
# HSV 색 공간에서 녹색 영역을 검출하여 합성
hsv = cv2.cvtColor(frame1, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, (50, 150, 0), (70, 255, 255)) # 영상, 최솟값, 최댓값
cv2.copyTo(frame2, mask, frame1)
cv2.imshow('frame', frame1)
key = cv2.waitKey(delay)
# 스페이스바를 누르면 do_composit 플래그를 변경
if key == ord(' '): # 스페이스바를 누르면 True로 변경
do_composit = not do_composot
elif key == 27: # esc 누르면 영상 종료
break
cap1.release() # 사용자 자원 해제
cap2.release()
cv2.destroyAllWindows()
[코드 실행]
녹색 배경 영상에서 스페이스바를 누르면 크로마 키 합성이 된 영상이 출력됩니다.
반응형
'Python > 파이썬 OpenCV 공부' 카테고리의 다른 글
[파이썬 OpenCV] 영상에 블러링(평균값 필터) 적용하기 - cv2.blur (0) | 2020.09.30 |
---|---|
[파이썬 OpenCV] 영상에 필터링 적용하기 - cv2.filter2D (0) | 2020.09.30 |
[파이썬 OpenCV] 히스토그램 역투영을 이용한 살색 영역 검출하기 - cv2.calcBackProject, cv2.calcHist (0) | 2020.09.29 |
[파이썬 OpenCV] 히스토그램 역투영 - cv2.calcBackProject, cv2.selectROI (0) | 2020.09.29 |
[파이썬 OpenCV] 트랙바를 이용한 특정 색상 영역 추출 - cv2.inRange, cv2.createTrackbar (0) | 2020.09.28 |