python 은 OpenCV 를 사용 하여 간단 한 이미지 분할 과 합성 을 진행 합 니 다.

사고의 방향 을 실현 하 다.
배경 모델 링 방법 을 통 해 원본 이미지 의 동적 인물 전망 을 분할 한 다음 에 목표 이미 지 를 배경 으로 합성 작업 을 하여 사용 가능 한 합성 영상 을 얻 을 수 있 습 니 다.
실현 절 차 는 다음 과 같다.
BackgroundSubtractorMOG 2 를 사용 하여 배경 분할 하기
BackgroundSubtractor MOG 2 는 고 스 혼합 모델 을 바탕 으로 하 는 배경 전경 분할 알고리즘 입 니 다.
혼합 가우스 모델

분포 확률 은 K 개의 고 스 분포 와 모든 고 스 분 포 는 자신 만 의 것 이다.μμ 화해시키다σσ 매개 변수 와 대응 하 는 가중치 매개 변 수 는 반드시 정수 이 고 모든 가중치 와 1 이 어야 하 며 공식 적 으로 수 치 를 제시 하 는 것 이 합 리 적 인 확률 밀도 치 를 확보 해 야 한다.우리 가 이 공식 에 대응 하 는 입력 공간 을 합치 면 결 과 는 1 과 같다 는 얘 기다.
원 알고리즘 으로 돌아 가면 픽 셀 마다 적당 한 수의 고 스 분 포 를 선택 하 는 것 이 특징 이다.고 스 모델 의 기대 와 기준 차 이 를 바탕 으로 혼합 고 스 모델 중의 어떤 고 스 모델 이 이 픽 셀 점 에 대응 할 가능성 이 있 는 지 판단 하고 부합 되 지 않 으 면 전망 으로 판단 된다.
인상 식별 으로 얼굴 정보 채 우기
직렬 분류 기 만 들 기

face_cascade = cv2.CascadeClassifier()
face_cascade.load(
  '/usr/local/anaconda3/envs/OpenCV/lib/python3.8/site-packages/cv2/data/haarcascade_frontalface_default.xml')
OpenCV 자체 의 직렬 분류 기 를 사용 하여 OpenCV 의 기본 이미지 인식 데 이 터 를 불 러 옵 니 다.
원본 이미지 의 인물 상 을 식별 하 다.

faces = face_cascade.detectMultiScale(gray, 1.3, 5)
형태학 으로 분 단 된 전망 을 채우다.

#          
fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
for i in range(15):
  fgmask = cv2.dilate(fgmask, kernel, iterations=1)
오픈 조작 을 통 해 전경 이미지 배열 의 소음 을 제거 한 후 반복 적 으로 팽창 하여 전경 윤곽 을 채 웁 니 다.
인상 과 목표 배경 을 합성 하 다

def resolve(o_img, mask, faces):
  if len(faces) == 0:
    return
  (x, y, w, h) = faces[0]
  rgb_mask_front = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
  rgb_mask_front = cv2.bitwise_not(rgb_mask_front)
  cv2.circle(rgb_mask_front, (int(x + w / 2), int(y + h / 2)), int((w + h) / 4), (0, 0, 0), thickness=-1)
  o_img = cv2.subtract(o_img, rgb_mask_front)
  return o_img
분 할 된 부분 을 다시 원본 이미지 와 줄 이 는 작업 은 하나의 마스크 로 원본 그림 에서 일부분 을 파 내 는 것 과 같다.
배경

out = resolve(frame, fgmask, faces)
out = cv2.add(out, c_frame)
코드 구현

import numpy as np
import cv2
import os

#        
camera = cv2.VideoCapture('./source/background_test2.avi')
cap = cv2.VideoCapture('./source/camera_test2.avi')
face_cascade = cv2.CascadeClassifier()
face_cascade.load(
   os.getcwd()+'/source/haarcascade_frontalface_default.xml')
#          
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
#               
fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows=False)


def resolve(o_img, mask, faces):
  if len(faces) == 0:
    return
  (x, y, w, h) = faces[0]
  rgb_mask_front = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
  rgb_mask_front = cv2.bitwise_not(rgb_mask_front)
  cv2.circle(rgb_mask_front, (int(x + w / 2), int(y + h / 2)), int((w + h) / 4), (0, 0, 0), thickness=-1)
  o_img = cv2.subtract(o_img, rgb_mask_front)
  return o_img


while True:
  ret, frame = cap.read()
  c_ret, c_frame = camera.read()
  gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

  fgmask = fgbg.apply(frame)
  #          
  fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
  gray_camera = cv2.cvtColor(c_frame, cv2.COLOR_BGR2GRAY)

  for i in range(15):
    fgmask = cv2.dilate(fgmask, kernel, iterations=1)

  faces = face_cascade.detectMultiScale(gray, 1.3, 5)
  out = resolve(frame, fgmask, faces)
  out = cv2.add(out, c_frame)
  cv2.imshow('Result', out)
  cv2.imshow('Mask', fgmask)
  k = cv2.waitKey(150) & 0xff
  if k == 27:
    break
out.release()
camera.release()
cap.release()
cv2.destroyAllWindows()
이상 은 python 이 OpenCV 를 사용 하여 간단 한 이미지 분할 과 합성 을 하 는 상세 한 내용 입 니 다.python opencv 이미지 분할 과 합성 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기