배경 분리(BS)는 정적 카메라를 사용하여 전경 마스크(장면에서 움직이는 물체에 속하는 픽셀을 포함하는 이진 이미지)를 생성하는 일반적인 기술입니다.
이름에서 알 수 있듯이 BS는 다음을 계산합니다. 전경 마스크는 관찰된 장면의 특성을 고려하여 현재 프레임과 장면의 정적 부분과 배경으로 간주될 수 있는 모든 것을 포함하는 배경 모델 간의 뺄셈을 수행합니다.
배경 모델링에는 두 가지 주요 단계가 포함됩니다.
1. 배경 초기화
2. 첫 번째 단계에서는 배경의 초기 모델이 계산됩니다. 모델이 업데이트되어 장면의 가능한 변경 사항에 적응하기 위해
은 사용자에게 비디오 파일 또는 이미지 시퀀스를 처리할 수 있는 옵션을 제공합니다. 이 예에서는 cv2.BackgroundSubtractorMOG2
가 전경 마스크를 생성하는 데 사용됩니다. cv2.BackgroundSubtractorMOG2
生成前景掩码。
from __future__ import print_function import cv2 import argparse parser = argparse.ArgumentParser( description='This program shows how to use background subtraction methods provided by OpenCV. You can process both videos and images.') parser.add_argument('--input', type=str, help='Path to a video or a sequence of image.', default='vtest.avi') parser.add_argument('--algo', type=str, help='Background subtraction method (KNN, MOG2).', default='MOG2') args = parser.parse_args() ## [create] # create Background Subtractor objects if args.algo == 'MOG2': backSub = cv2.createBackgroundSubtractorMOG2() else: backSub = cv2.createBackgroundSubtractorKNN() ## [create] ## [capture] capture = cv2.VideoCapture(args.input) if not capture.isOpened(): print('Unable to open: ' + args.input) exit(0) ## [capture] while True: ret, frame = capture.read() if frame is None: break ## [apply] # update the background model fgMask = backSub.apply(frame) ## [apply] ## [display_frame_number] # get the frame number and write it on the current frame cv2.rectangle(frame, (10, 2), (100,20), (255,255,255), -1) cv2.putText(frame, str(capture.get(cv2.CAP_PROP_POS_FRAMES)), (15, 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5 , (0,0,0)) ## [display_frame_number] ## [show] # show the current frame and the fg masks cv2.imshow('Frame', frame) cv2.imshow('FG Mask', fgMask) ## [show] keyboard = cv2.waitKey(30) if keyboard == 'q' or keyboard == 27: break
分析上面代码的主要部分:
cv2.BackgroundSubtractor
对象将用于生成前景掩码。在此示例中,使用了默认参数,但是也可以在create
函数中声明特定的参数。
# create Background Subtractor objects KNN or MOG2 if args.algo == 'MOG2': backSub = cv2.createBackgroundSubtractorMOG2() else: backSub = cv2.createBackgroundSubtractorKNN()
cv2.VideoCapture
对象用于读取输入视频或输入图像序列
capture = cv2.VideoCapture(args.input) if not capture.isOpened: print('Unable to open: ' + args.input) exit(0)
每帧都用于计算前景掩码和更新背景。如果要更改用于更新背景模型的学习率,可以通过将参数传递给apply
方法来设置特定的学习率
# update the background model fgMask = backSub.apply(frame)
当前帧编号可以从cv2.Videocapture
# get the frame number and write it on the current frame cv2.rectangle(frame, (10, 2), (100,20), (255,255,255), -1) cv2.putText(frame, str(capture.get(cv2.CAP_PROP_POS_FRAMES)), (15, 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5 , (0,0,0))
cv2.BackgroundSubtractor
개체는 전경 마스크를 생성하는 데 사용됩니다. 이 예에서는 기본 매개변수가 사용되지만 create
함수에서 특정 매개변수를 선언할 수도 있습니다. # show the current frame and the fg masks cv2.imshow('Frame', frame) cv2.imshow('FG Mask', fgMask)
cv2.VideoCapture
개체는 입력 비디오 또는 입력 이미지 시퀀스를 읽는 데 사용됩니다. 🎜🎜🎜rrreee🎜🎜🎜각 프레임은 전경 마스크를 계산하고 업데이트하는 데 사용됩니다. 배경 . 배경 모델을 업데이트하는 데 사용되는 학습률을 변경하려면 apply
메서드에 매개변수를 전달하여 특정 학습률을 설정할 수 있습니다. 🎜🎜🎜rrreee🎜🎜🎜현재 프레임 번호를 얻을 수 있습니다. cv2. Videocapture
개체에서 추출되어 현재 프레임의 왼쪽 상단에 펀치됩니다. 흰색 직사각형을 사용하여 검정색 프레임 번호 강조 표시 🎜🎜🎜rrreee🎜🎜🎜현재 입력 프레임 및 결과 표시🎜🎜🎜rrreee위 내용은 Python OpenCV는 배경 분리 방법을 어떻게 사용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!