본문 바로가기
Python/Computer Vision

[파이썬, Python] OpenCV - 크로마키(cromakey)

by coding-choonsik 2023. 8. 25.
728x90
반응형
SMALL

1. inRange()

  • 이미지에서 지정된 범위 안에 픽셀을 찾아냄
  • cv2.inRange(영상, min값, max값)

 

✅ inRange()를 활용하여 영상에서 녹색계열만 추출하기

import cv2

src = cv2.imread('candies.png')
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)

'''
RGB 녹색계열
0 <= B <= 100
128 <= G <= 255
0 <= R <= 100

HSV 녹색계열
50 <= H <= 80
150 <= S <= 255
0 <= V <= 255
 
'''
# HSV에서 녹색계열을 범위로 뽑아낼 수 있음
dst = cv2.inRange(hsv, (50, 150, 0), (80, 255, 255))

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()

 

▲candies.jpg에서 녹색계열만 추출


2. copyTo()

  • 마스크 연산을 지원하는 픽셀 값 복사 함수
  • cv2.copyTo(영상, 마스크, 출력영상=None)

 

✅ src의 마스크부분을 추출하여 dst에 합성하기

import cv2

src = cv2.imread('airplane.bmp')
mask = cv2.imread('mask_plane.bmp', cv2.IMREAD_GRAYSCALE)
dst = cv2.imread('field.bmp')

# 출력영상을 넣지 않으면 새로 영상을 만들어 냄
# 입력 영상과 마스크, 출력 영상의 크기가 모두 같아야 함
cv2.copyTo(src, mask, dst)

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()

▲ 순서대로 src, mask, dst

 


✅ woman.mp4와 특정 비디오파일을 이용하여 크로마키 프로그램을 만들어보자.
(단, woman.mp4 플레이 중 스페이스바를 누르면 합성)

woman.mp4
8.90MB
ocean.mp4
9.80MB

import cv2


cap1 = cv2.VideoCapture('woman.mp4')
cap2 = cv2.VideoCapture('ocean.mp4')

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 = round(cap2.get(cv2.CAP_PROP_FRAME_COUNT))
fps = round(cap1.get(cv2.CAP_PROP_FPS))
print(w)
print(h)
print(frame_cnt1)
print(frame_cnt2)
print(fps)

isKeypress = False

while True:
    ret1, frame1 = cap1.read()

    if not ret1:
        break
    if isKeypress:
        ret2, frame2 = cap2.read()
        if not ret2:
            break

        hsv = cv2.cvtColor(frame1, cv2.COLOR_BGR2HSV)
        mask = cv2.inRange(hsv, (50, 150, 0), (80, 255, 255))
        cv2.copyTo(frame2, mask, frame1)  # 입력: 동영상2, 출력: 동영상1

    cv2.imshow('frame1', frame1)
    if cv2.waitKey(10) == ord(' '):
        isKeypress = not isKeypress
    elif cv2.waitKey(10) == 27:
        break

cap1.release()
cap2.release()

▲ 녹색계열을 추출하여 크로마키 적용

 

 

728x90
반응형
LIST