>백엔드 개발 >파이썬 튜토리얼 >Python OpenCV는 배경 분리 방법을 어떻게 사용합니까?

Python OpenCV는 배경 분리 방법을 어떻게 사용합니까?

王林
王林앞으로
2023-05-16 21:09:151320검색

이론

  • 배경 분리(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제