본문 바로가기
Study/Python

[Python] OpenCV - 7 이미지 합성하기

by YoungD 2023. 10. 27.
import cv2

psy = cv2.imread('images/psy.png')
tiger = cv2.imread('images/tiger.png')

# 마스크 이진이미지 만들기 = 사용할 부분과 사용하지 않을 부분 구분하기
# 검은 부분 사용, 흰부분 사용 X
mask2gray = cv2.cvtColor(tiger, cv2.COLOR_BGR2GRAY)
_, mask_b = cv2.threshold(mask2gray, 200, 255, cv2.THRESH_BINARY)

# 마스크 이미지 반전
# 흰부분 사용, 검은 부분 사용 X(위와 반대)
mask_b_inv = cv2.bitwise_not(mask_b)

# 호랑이 이미지에서 사용할 영역의 값만 추출하기(흰부분 가져오고 검은 부분 안 가져옴)
sub_psy = psy[94:217, 239:371]
img_bg = cv2.bitwise_and(sub_psy, sub_psy, mask = mask_b)
img_fg = cv2.bitwise_and(tiger, tiger, mask = mask_b_inv)

# cv2.imshow('img_bg', img_bg)
# cv2.imshow('img_fg', img_fg)

# 두 이미지 합치기
bg_fg = cv2.add(img_bg, img_fg)
# cv2.imshow('bg_fg',bg_fg)

# 원래 이미지에 합성하기
psy[94:217, 239:371] = bg_fg
cv2.imshow('psy', psy)

# cv2.imshow('mask_b', mask_b)
# cv2.imshow('mask_b_inv', mask_b_inv)

# ROI = 싸이 얼굴영역 추출
# 추출된 영역에 호랑이 이미지 합성하기
# psy[94:217, 239:371] = tiger

# cv2.imshow('psy', psy)
# cv2.imshow('tiger',tiger)
cv2.waitKey(0)
cv2.destroyAllWindows()
In [2]:
# True = 1
# False = 0
True + True + True
Out[2]:
3
In [3]:
# ROI(Region of Image) : 관심영역 : 싸이 얼굴영역
In [4]:
# 컬러 이미지
# 세로, 가로, 색상 채널
psy.shape
Out[4]:
(838, 630, 3)
In [5]:
# 좌 상단 좌표 : 280, 50)
# 우하단 좌표: 400, 200
# 싸이 얼굴 영역 자르기
# [열 = y, 행 = x]
sub_psy = psy[94:217, 239:371]
cv2.imshow('sub', sub_psy)
cv2.waitKey(0)
cv2.destroyAllWindows()
In [6]:
# y = 123
# x = 132
tiger.shape
Out[6]:
(123, 132, 3)
In [7]:
# 카메라 연동 후 고정된 영역에 마스크 출력하기
In [8]:
import cv2

cap = cv2.VideoCapture(0)

# 한 번만 실행되어도 상관 없음
tiger = cv2.imread('images/tiger.png')
mask2gray = cv2.cvtColor(tiger, cv2.COLOR_BGR2GRAY)
_, mask_b = cv2.threshold(mask2gray, 200, 255, cv2.THRESH_BINARY)
mask_b_inv = cv2.bitwise_not(mask_b)

while cap.isOpened() :
    ret, frame = cap.read()
    frame = cv2.flip(frame, 1)

    if not ret :
        print("종료")
        break

    sub_frame = frame[ 94:217 , 239:371]
    img_bg = cv2.bitwise_and(sub_frame, sub_frame, mask = mask_b)
    img_fg = cv2.bitwise_and(tiger,tiger, mask = mask_b_inv)
    bg_fg = cv2.add(img_bg,img_fg)
    frame[ 94:217 , 239:371] = bg_fg

    
    cv2.imshow("video", frame)
    
    key = cv2.waitKey(33)
    
    if key == 49 :
        print("종료")
        break
        
cap.release()
cv2.destroyAllWindows()
종료

'Study > Python' 카테고리의 다른 글

[Python] OpenCV - 9 Mediapipe-Hand  (0) 2023.10.31
[Python] OpenCV - 8 Mediapipe 사용하기  (0) 2023.10.30
[Python] OpenCV - 6 템플릿 매칭  (0) 2023.10.26
[Python]OpenCV - 5 이미지 처리  (0) 2023.10.25
[Python] OpenCV - 4 Flask  (0) 2023.10.24