Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 파이썬에서 크로마 키 합성하기 - cv2.inRange(), cv2.copyTo() 활용

AI 꿈나무 2020. 9. 29. 16:25
반응형

황선규 박사님의 <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()

 

[코드 실행]

 녹색 배경 영상에서 스페이스바를 누르면 크로마 키 합성이 된 영상이 출력됩니다.

 

반응형