カラーキーの例


カラーキー合成


  • 定義:緑または青の背景で撮影されたビデオを別の背景ビデオに合成します.

  • 実装する機能:
  • 緑色スクリーン領域抽出
  • 緑の領域で他の背景ビデオを合成し、
  • を保存する.
  • スペースキーを使用して合成操作
  • を制御する

  • 緑の画面領域を抽出
  • のカラー画像を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()
    
  • のスペースキーを押すと前後比較
  • *前

    *後