Open cv로 영상 배경화면 변경하기

chi yeong Yu·2022년 4월 20일
0

opencv

목록 보기
11/12

open-cv를 이용해서 기존 영상을 새로운 배경에 적용해보겠습니다 😉

import tensorflow as tf
import cv2
import numpy as np
import matplotlib.pyplot as plt
from tf_bodypix.api import download_model, load_model, BodyPixModelPaths
# tensorflow bodypix - 몸 형태를 학습된 모델을 불러와서 적용시켰습니다.

bodypix_model = load_model(download_model(BodyPixModelPaths.MOBILENET_FLOAT_50_STRIDE_16))
# python-tf-bodypix/tf_bodypix/download.py에 가면 여러 형태의 학습된 모델을 적용 할 수 있습니다.

cap = cv2.VideoCapture('hiking.mp4')

img = cv2.imread('mountain.jpg')
img = img[:720, :1280, :]
# 사이즈를 영상과 다르게 하면 Error발생 
while cap.isOpened():
    ret, frame = cap.read()
    
    result = bodypix_model.predict_single(frame)
    mask = result.get_mask(threshold=0.5).numpy().astype(np.uint8)
    masked_image = cv2.bitwise_and(frame, frame, mask=mask)
    
    neg = np.add(mask, -1) 
    inverse = np.where(neg == -1, 1, neg).astype(np.uint8)
    # mask 부분은 0과 1로 되어있는데 
    # -1을 주고 -1인 부분의 위치만 따로 빼서 1로 바꾼 후 mask 위치를 재 설정
    masked_background = cv2.bitwise_and(img, img, mask=inverse)
    # cv2.bitwise_and(1, 2) -> 1, 2 개의 이미지 중 둘 다 값이 1인 경우만 표시 
    final = cv2.add(masked_image, masked_background)
    
    cv2.imshow('BodyPix', final)

    if cv2.waitKey(10) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()
plt.imshow(mask)
img = cv2.imread('mountain.jpg')
img = img[:frame.shape[0], :frame.shape[1], :]
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# 적용할 배경사진 및 영상
Result 
threshold를 조정했는데 높아질 수록 사진이 잘려나가버리는 상황발생
다른 모델들을 적용해서 결과를 확인해봐야겠습니다.

마지막으로 설치 시에 충돌이 많이 일어나서 새로운 환경을 적용하고 설치 진행을 추천드립니다.

windows python 3.8
pip install tf-bodypix
pip install tfjs_graph_converter
pip install tensorflow==2.6.0
pip install tensorflow-gpu==2.6.0
pip install opencv-python
pip install matplotlib

여기서 문제가 발생하면 -->
Keras, tensorflow-estimator 버전 확인해보셔야합니다.
tensorflow와 버전이 다르면 
pip uninstall keras, tensorflow-estimator 진행
pip install keras==2.6.0 tensorflow-estimator==2.6.0
(텐서플로우와 같은 버전)
!끝!
profile
호기심천국

0개의 댓글