Background Subtraction

  • مدرس: علی بیگدلی
  • تاریخ انتشار: Sep 12, 2020

اهداف

  • ما با روشهای تفریق پس زمینه موجود در OpenCV آشنا خواهیم شد.

مقدمه

تفریق پس زمینه یک مرحله مهم پیش پردازش در بسیاری از برنامه های مبتنی بر دید است. به عنوان مثال ، مواردی مانند شمارنده بازدید کننده را در نظر بگیرید که در آن یک دوربین ثابت از تعداد بازدیدکنندگان ورودی یا خروجی از اتاق استفاده می کند ، یا یک دوربین ترافیکی اطلاعات مربوط به وسایل نقلیه را استخراج می کند. در همه این موارد ، ابتدا باید شخص یا وسایل نقلیه را به تنهایی استخراج کنید. . از نظر فنی ، شما باید پیش زمینه متحرک را از پس زمینه ایستا استخراج کنید.

اگر تصویری از پس زمینه به تنهایی دارید ، مانند تصویر اتاق بدون بازدید کننده ، تصویر جاده بدون وسایل نقلیه و غیره ، کار ساده ای است. فقط تصویر جدید را از پس زمینه کم کنید. شما اشیای پیش زمینه را به تنهایی دریافت می کنید. اما در بیشتر موارد ، ممکن است شما چنین تصویری نداشته باشید ، بنابراین ما باید از هر تصویری که داریم پس زمینه را استخراج کنیم. وقتی سایه وسایل نقلیه وجود داشته باشد ، پیچیده تر می شود. از آنجا که سایه نیز در حال حرکت است ، تفریق ساده آن را به عنوان پیش زمینه نیز مشخص می کند. کار را پیچیده می کند.

چندین الگوریتم برای این منظور معرفی شد. OpenCV سه الگوریتم از این قبیل را پیاده سازی کرده است که استفاده از آن بسیار آسان است. ما آنها را یک به یک خواهیم دید.

BackgroundSubtractorMOG

این یک الگوریتم زمینه سازی / زمینه پیش زمینه تقسیم بر اساس مخلوط گاوسی است. این مقاله در مقاله "یک مدل مخلوط پس زمینه سازگار برای ردیابی در زمان واقعی با تشخیص سایه" توسط P. KadewTraKuPong و R. Bowden در سال 2001 معرفی شد. از روشی برای مدل سازی هر پیکسل پس زمینه با مخلوطی از توزیع K Gaussian استفاده می شود ( K = 3 تا 5). وزن های مخلوط نشان دهنده تناسب زمانی است که آن رنگ ها در صحنه باقی می مانند. رنگ پس زمینه احتمالی آنهایی است که طولانی تر و ساکن تر می شوند.

هنگام کدگذاری ، باید یک شی background پس زمینه با استفاده از تابع ، cv2.createBackgroundSubtractorMOG () ایجاد کنیم. این پارامترهای اختیاری دارد مانند طول تاریخ ، تعداد مخلوط های گاوسی ، آستانه و غیره. همه روی برخی مقادیر پیش فرض تنظیم شده است. سپس در داخل حلقه ویدیو ، از روش backgroundsubtractor.apply () استفاده کنید تا ماسک پیش زمینه را بدست آورید.

import numpy as np
import cv2

cap = cv2.VideoCapture('test.avi')

fgbg = cv2.createBackgroundSubtractorMOG()

while(1):
    ret, frame = cap.read()

    fgmask = fgbg.apply(frame)

    cv2.imshow('frame',fgmask)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

خروجی:

BackgroundSubtractorMOG2

همچنین یک الگوریتم زمینه سازی / پیش زمینه تقسیم بندی مبتنی بر مخلوط گاوسی است. این مقاله بر اساس دو مقاله از Z.Zivkovic ساخته شده است: تعداد مناسب توزیع گوسی را برای هر پیکسل انتخاب می کند. (به یاد داشته باشید ، در آخرین مورد ، ما توزیع K gaussian را در سراسر الگوریتم انجام دادیم). این سازگاری بهتری را در صحنه های مختلف به دلیل تغییرات روشنایی و غیره فراهم می کند.

مانند مورد قبلی ، ما باید یک شی sub کم کننده پس زمینه ایجاد کنیم. در اینجا ، شما می توانید انتخاب کنید که سایه شناسایی شود یا خیر. اگر DetectShadows = درست است (که به طور پیش فرض چنین است) ، سایه ها را شناسایی و مشخص می کند ، اما سرعت را کاهش می دهد. سایه ها با رنگ خاکستری مشخص می شوند.

import numpy as np
import cv2

cap = cv2.VideoCapture('test.avi')

fgbg = cv2.createBackgroundSubtractorMOG2()

while(1):
    ret, frame = cap.read()

    fgmask = fgbg.apply(frame)

    cv2.imshow('frame',fgmask)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

خروجی:

 

BackgroundSubtractorGMG

این الگوریتم تخمین آماری تصویر پس زمینه و تقسیم بندی بیزی در هر پیکسل را ترکیب می کند. توسط Andrew B. Godbehere ، Akihiro Matsukawa ، Ken Goldberg در مقاله خود "ردیابی تصویری بازدیدکنندگان انسانی تحت شرایط روشنایی متغیر برای نصب هنری صوتی پاسخگو" در سال 2012 معرفی شد. طبق مقاله ، این سیستم یک صدای  تعاملی موفق را اجرا می کند نصب هنری به نام "آیا ما هنوز آنجا هستیم؟" از 31 مارس - 31 ژوئیه 2011 در موزه یهودی معاصر در سانفرانسیسکو ، کالیفرنیا.

از چند فریم اول (120 به طور پیش فرض) برای مدل سازی پس زمینه استفاده می کند. از الگوریتم تقسیم پیش زمینه احتمالی استفاده می کند که اشیا possible پیش زمینه احتمالی را با استفاده از استنباط بیزی شناسایی می کند. برآوردها سازگار است. مشاهدات جدید نسبت به مشاهدات قدیمی دارای وزن بیشتری هستند تا نور متغیر را در خود جای دهند. چندین عمل فیلتر کردن ریخت شناسی مانند بستن و باز کردن برای از بین بردن نویز ناخواسته انجام می شود. در طی چند فریم اول یک پنجره سیاه مشاهده خواهید کرد.

برای از بین بردن نویز بهتر است از دهانه ریخت شناسی استفاده شود.

import numpy as np
import cv2

cap = cv2.VideoCapture('test.avi')

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
fgbg = cv2.createBackgroundSubtractorGMG()

while(1):
    ret, frame = cap.read()

    fgmask = fgbg.apply(frame)
    fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)

    cv2.imshow('frame',fgmask)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

خروجی:

قطعه کد زیر برنامه نمونه تشخیص حرکت در تصویر است که می توانید برای موارد مورد نیاز خود تغییر و از آن استفاده نمایید:

import cv2
import numpy as np

capture = cv2.VideoCapture(0)

fgbg = cv2.createBackgroundSubtractorMOG2(300, 400, True)

frameCount = 0

while(1):

	ret, frame = capture.read()

	if not ret:
		break

	frameCount += 1
	resizedFrame = cv2.resize(frame, (0, 0), fx=0.50, fy=0.50)

	fgmask = fgbg.apply(resizedFrame)

	count = np.count_nonzero(fgmask)

	print('Frame: %d, Pixel Count: %d' % (frameCount, count))

	# Determine how many pixels do you want to detect to be considered "movement"
	if (frameCount > 1 and count > 2000):
		cv2.putText(resizedFrame, 'motion detected', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA)

	cv2.imshow('Frame', resizedFrame)
	cv2.imshow('Mask', fgmask)


	k = cv2.waitKey(1) & 0xff
	if k == 27:
		break

capture.release()
cv2.destroyAllWindows()

خروجی:

 

ثبت دیدگاه
نام *
ایمیل*
دیدگاه *
0دیدگاه