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 이미지 분할 과 합성 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.