Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah python OpenCV menggunakan kaedah pemisahan latar belakang?

Bagaimanakah python OpenCV menggunakan kaedah pemisahan latar belakang?

王林
王林ke hadapan
2023-05-16 21:09:151287semak imbas

Teori

  • Pemisahan Latar Belakang (BS) ialah teknik biasa untuk menghasilkan topeng latar depan (imej binari yang mengandungi piksel kepunyaan objek bergerak di tempat kejadian) dengan menggunakan kamera statik

  • Seperti namanya, BS mengira topeng latar depan, melakukan operasi penolakan antara bingkai semasa dan model latar belakang, yang mengandungi bahagian statik adegan, yang boleh dilihat sebagai sebagai latar belakang untuk segala-galanya.

  • Pemodelan latar belakang merangkumi dua langkah utama:

    • 1

    • 2. Kemas kini latar belakang Dalam langkah pertama, kira model awal latar belakang Dalam langkah kedua, kemas kini model untuk menyesuaikan diri dengan kemungkinan perubahan dalam pemandangan
    • Pelaksanaan
membolehkan pengguna memilih untuk memproses fail video atau jujukan imej. Dalam contoh ini,

akan digunakan untuk menjana topeng latar depan.

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

Analisis Kodcv2.BackgroundSubtractorMOG2

Analisis bahagian utama kod di atas: Objek

    akan digunakan untuk menjana topeng latar depan. Dalam contoh ini, parameter lalai digunakan, tetapi parameter khusus juga boleh diisytiharkan dalam fungsi
  • .

    cv2.BackgroundSubtractorcreate

    # create Background Subtractor objects  KNN or MOG2
    if args.algo == 'MOG2':
        backSub = cv2.createBackgroundSubtractorMOG2()
    else:
        backSub = cv2.createBackgroundSubtractorKNN()

    objek digunakan untuk membaca input video atau urutan imej input
  • cv2.VideoCapture

    capture = cv2.VideoCapture(args.input)
    if not capture.isOpened:
        print('Unable to open: ' + args.input)
        exit(0)

    Setiap bingkai digunakan untuk mengira topeng latar depan dan mengemas kini latar belakang
  • . Jika anda ingin menukar kadar pembelajaran yang digunakan untuk mengemas kini model latar belakang, anda boleh menetapkan kadar pembelajaran tertentu dengan menghantar parameter kepada kaedah

    apply

    # update the background model
        fgMask = backSub.apply(frame)

nombor bingkai semasa Boleh diekstrak daripada objek
    dan dicop di penjuru kiri sebelah atas bingkai semasa. Gunakan segi empat tepat putih untuk menyerlahkan nombor bingkai hitam
  • 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))

Tunjukkan bingkai input semasa dan hasil
  • # show the current frame and the fg masks
        cv2.imshow('Frame', frame)
        cv2.imshow('FG Mask', fgMask)

Atas ialah kandungan terperinci Bagaimanakah python OpenCV menggunakan kaedah pemisahan latar belakang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam