基於光流法和混合高斯模型對監控視頻中的人羣進行跟蹤

實驗數據:

UCSD Anomaly Detection Dataset

該數據集由加州大學聖迭戈分校提供,由一個安裝在高處、俯瞰人行道的固定攝像機獲取的監控視頻。視頻中人羣密度由稀疏到密集不等。其中正常定義:視頻中僅有行人;異常定義爲:視頻中出現自行車/汽車/滑板車/輪椅等異常運動模式。數據集中提供了兩個場景,分別爲UCSDped1和UCSDped2,每個場景下又分爲Train和Test,下面又會分爲N個片段,每個片段都會有200幀圖像。本實驗用到“UCSDped1/Train/Train007”這一片段,下面爲該片段的視頻演示:

實驗代碼:

環境:Win10 | Python 3.7.3 | OpenCV 4.1.0

步驟一:前景提取

利用高斯混合模型分離圖像幀的前景和背景

# 創建混合高斯模型
fgbg = cv2.createBackgroundSubtractorMOG2()

for frame in frames:
	frame_img = cv2.imread(frame_path + frame, 1)
	# 利用混合高斯模型提取前景
	fgmask = fgbg.apply(frame_img)

提取前景後的視頻演示:

步驟二:跟蹤運動

利用Lucas Kanade光流法跟蹤監控視頻中的運動,這裏利用上面提取的前景計算光流。

# Shi-Tomasi 角點檢測參數
feature_params = dict( maxCorners = 100,
                       qualityLevel = 0.3,
                       minDistance = 7,
                       blockSize = 7)

# lucas kanade光流法參數
lk_params = dict( winSize  = (15, 15),
                  maxLevel = 2,
                  criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
first_rgbframe = cv2.imread(frameFG_path + frames[1], 1)

# 計算第一幀的灰度圖
first_frame = cv2.cvtColor(first_rgbframe, cv2.COLOR_BGR2GRAY)

#獲取圖像中的角點,返回到p0中
p0 = cv2.goodFeaturesToTrack(first_frame, mask = None, **feature_params)

# 創建一個蒙版用來畫軌跡
mask = np.zeros_like(first_rgbframe)

old_frame = first_frame
new_frame = np.zeros_like(old_frame)

for frame_i in frames:
	rgbframe = cv2.imread(frameFG_path + frame_i, 1)
	rgbframe_bg = cv2.imread(frame_path + frame_i, 1)
	frame = cv2.cvtColor(rgbframe, cv2.COLOR_BGR2GRAY)
	new_frame = frame

	# 計算光流
	p1, st, err = cv2.calcOpticalFlowPyrLK(old_frame, new_frame, p0, None, **lk_params)
	if (p1 is None):
		continue
	# 選取好的跟蹤點
	good_new = p1[st == 1]
	good_old = p0[st == 1]

	# 畫出軌跡
	for i, (new, old) in enumerate(zip(good_new, good_old)):
		a,b = new.ravel()
		c,d = old.ravel()
		mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 1)
		rgbframe = cv2.circle(rgbframe_bg, (a, b), 2, color[i].tolist(), -1)
	img = cv2.add(rgbframe, mask)

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

	# 更新上一幀的圖像和追蹤點
	old_gray = frame.copy()
	p0 = good_new.reshape(-1,1,2)

	old_frame = new_frame

在光流跟蹤時調用OpenCV的line和circle畫圖功能添加運動軌跡,並以蒙版的形式添加到原來的幀圖像上,處理後的視頻演示:

後續工作:

利用光流法得出的運動信息分析和預測視頻中的異常行爲。

基於光流法和混合高斯模型檢測人羣異常

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章