크로마키 예제

2205 단어 opencvopencv

크로마키 합성

  • 정의: 녹색 또는 파란색 배경에서 촬영한 영상을 다른 배경 영상에 합성

  • 구현할 기능:

    • 녹색 스크린 영역 추출
    • 녹색 영역에 다른 배경 영상 합성하여 저장
    • 스페이스바를 이용하여 크로마 키 합성 동작 제어하기
  • 녹색 스크린 영역 추출하기

    • 크로마키 영상을 HSV색 공간으로 변환
    • cv2.inRange()함수를 통해 50<=H <=80 , 150<=S<=255, 0<= V<=255 범위 추출

  • 녹색 영역에 다른 배경 합성하기

    	- 마스크 연산을 지원하는 cv2.copyTo()함수 사용

  • CODE
import sys
import numpy as np
import cv2


# 녹색 배경 동영상
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는 같다고 가정
frame_cnt1 = round(cap1.get(cv2.CAP_PROP_FRAME_COUNT))
frame_cnt2 = round(cap2.get(cv2.CAP_PROP_FRAME_COUNT))
print('frame_cnt1:', frame_cnt1)
print('frame_cnt2:', frame_cnt2)

fps = cap1.get(cv2.CAP_PROP_FPS)
delay = int(1000 / fps)

# 합성 여부 플래그
do_composit = False

# 전체 동영상 재생
while True:
    ret1, frame1 = cap1.read()

    if not ret1:
        break
    
    # do_composit 플래그가 True일 때에만 합성
    if do_composit:
        ret2, frame2 = cap2.read()

        if not ret2:
            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(' '):
        do_composit = not do_composit
    elif key == 27:
        break

cap1.release()
cap2.release()
cv2.destroyAllWindows()
  • 스페이스바 누르기 전과 후 비교

*전

*후

좋은 웹페이지 즐겨찾기