唐宇迪opencv-背景建模
?參考【計(jì)算機(jī)視覺-OpenCV】唐宇迪博士教會(huì)了我大學(xué)四年沒學(xué)會(huì)的OpenCV OpenCV計(jì)算機(jī)視覺實(shí)戰(zhàn)全套課程(附帶課程課件資料+課件筆記+源碼)_嗶哩嗶哩_bilibili
幀差法
由于場景中的目標(biāo)在移動(dòng),目標(biāo)的影像在不同圖像幀中的位置不同。該類算法對(duì)時(shí)間上連續(xù)的兩幀圖像進(jìn)行差分運(yùn)算,不同幀對(duì)應(yīng)的像素點(diǎn)相減,判斷灰度差的絕對(duì)值,當(dāng)絕對(duì)值超過一定閾值時(shí),即可判斷為運(yùn)動(dòng)目標(biāo),從而實(shí)現(xiàn)目標(biāo)的檢測功能。
幀差法運(yùn)用簡單,但是存在引入噪聲和空洞的問題
混合高斯模型
在進(jìn)行前景檢測前,先對(duì)背景進(jìn)行訓(xùn)練,對(duì)圖像中每個(gè)背景采用一個(gè)混合高斯模型進(jìn)行模擬,每個(gè)背景的混合高斯的個(gè)數(shù)可以自適應(yīng).然后再測試階段,對(duì)新來的像素進(jìn)行GNN匹配,如果該像素值能夠匹配其中一個(gè)高斯,則以為是背景.否則認(rèn)為是前景.由于整個(gè)過程GMM模型在不斷更新學(xué)習(xí)中,所以對(duì)動(dòng)態(tài)背景有一定的魯棒性.最后通過對(duì)一個(gè)有樹枝搖擺的動(dòng)態(tài)背景進(jìn)行前景檢測,取得了較好的效果. ??背景的實(shí)際分布是多個(gè)高斯分布混合在一起,每個(gè)高斯模型也可以帶有權(quán)重? 混合高斯模型學(xué)習(xí)方法
1. 首先初始化每個(gè)高斯模型矩陣參數(shù).
2.取視頻中T幀數(shù)據(jù)圖像用來訓(xùn)練高斯混合模型,來了第一個(gè)像素之后用它當(dāng)作第一個(gè)高斯分布
3.當(dāng)后面來的像素值時(shí),與前面已有的高斯均值比較,如果該像素點(diǎn)的值與其模型均值差在3倍的方差內(nèi),屬于該分布 ,并對(duì)其進(jìn)行修改
4. 如果下一次來的像素不滿足當(dāng)前分布,用它來創(chuàng)建一個(gè)新的高斯分布. ??
混合高斯模型測試方法???????????????
??在測試階段,對(duì)新來像素點(diǎn)的值與混合高斯模型中的每一個(gè)均值進(jìn)行比較,如果其差值在2倍的方差之內(nèi)的話,則認(rèn)為是背景,否則認(rèn)為是前景。將前景賦值為255,背景賦值為0.這樣就形成了一副前景二值圖。
?項(xiàng)目實(shí)戰(zhàn):
import numpy as np import cv2# 經(jīng)典的測試視頻 cap = cv2.VideoCapture('E:/anaconda3/picture/test.avi') # 形態(tài)學(xué)操作需要使用 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) # 創(chuàng)建混合高斯模型用于背景建模 fgbg = cv2.createBackgroundSubtractorMOG2()while (True):ret, frame = cap.read() # 一幀一幀讀取視頻fgmask = fgbg.apply(frame) # 將獲取到的每一幀圖像都應(yīng)用到當(dāng)前的背景提取當(dāng)中,前景置為255,背景置為0# 形態(tài)學(xué)中開運(yùn)算去掉噪音點(diǎn)fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)# 尋找視頻中的輪廓im, contours, hierarchy = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for c in contours:# 計(jì)算各輪廓的周長perimeter = cv2.arcLength(c, True) # 計(jì)算各輪廓的周長if perimeter > 188:# 找到一個(gè)直矩陣(不會(huì)旋轉(zhuǎn))x, y, w, h = cv2.boundingRect(c)# 畫出這個(gè)矩陣cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)cv2.imshow('frame', frame)cv2.imshow('fgmask', fgmask)k = cv2.waitKey(150) & 0xffif k == 27: # 表示Esc退出breakcap.release() cv2.destroyAllWindows()總結(jié)
以上是生活随笔為你收集整理的唐宇迪opencv-背景建模的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5中使页面中元素居中
- 下一篇: 终极算法【4】——联结学派