欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用帧差法检测运动物体

程序员文章站 2022-05-30 11:58:32
...

1. 基本原理

  帧间差分法是一种通过对视频图像序列的连续两帧图像做差分运算获取运动目标轮廓的方法。当监控场景中出现异常目标运动时,相邻两帧图像之间会出现较为明显的差别,两帧相减,求得图像对应位置像素值差的绝对值,判断其是否大于某一阈值,进而分析视频或图像序列的物体运动特性。其数学公式描述如下:

  利用帧差法检测运动物体

  D(x,y)为连续两帧图像之间的差分图像,I(t)和I(t-1)分别为t和t-1时刻的图像,T为差分图像二值化时选取的阈值,D(x,y) = 1表示前景,D(x,y) = 0表示背景。

2. 优缺点

  优点:算法实现简单,程序设计复杂度低,运行速度快;动态环境自适应性强,对场景光线变化不敏感。

  缺点:“空洞”现象(运动物体内部灰度值相近);“双影”现象(差分图像物体边缘轮廓较粗);不能提取出运动对象的完整区域,仅能提取轮廓;算法效果严重依赖所选取的帧间时间间隔和分割阈值。

  利用帧差法检测运动物体 利用帧差法检测运动物体

3. 三帧差法

  目的:解决帧间差分法的“双影”问题。算法步骤如下:

  利用帧差法检测运动物体

  可在一定程度上消除帧间差分法的“双影”现象。

 

在眼部提取中,摄像头对着眼部区域照射,但是会映入皮肤和外界光线的干扰,对提取眼部 睁眼闭眼 曲线造成一定困扰。

故考虑使用检测运动物体的思路,但是这个时候发现,眼球的转动,同样也是运动物体,也带来了一定的误差,但总体睁眼闭眼明显。

# -*- coding: utf-8 -*-
"""
Created on Mon Sep  3 16:14:48 2018

@author: Lenovo
"""

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
cv.namedWindow('Image')
cap  = cv.VideoCapture('WIN_20180903_16_06_34_Pro.mp4')
formerimg=0
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
plt.grid(True) #添加网格
plt.ion()  #interactive mode on
graylist = list()
i=0
while 1:
    i=i+1
    issuc,img = cap.read()
    img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    img = img.astype(np.int32)
    finalimg = img-formerimg
    finalimg =finalimg.astype(np.uint8)
    finalimg[finalimg<200]=0
    finalimg[finalimg>200]=255
#            r = img[:,:,0]
    print(len(finalimg[np.where(finalimg==255)]))
    graylist.append(len(finalimg[np.where(finalimg==255)]))
    ax.scatter(i,len(finalimg[np.where(finalimg==255)]),c='r',marker='.')
#            plt.hist(r.flatten(),256)
    intimg = img.astype(np.uint8)
    cv.imshow('Image',intimg)
    formerimg = img
    plt.pause(0.5)
    if cv.waitKey(1) & 0xFF == 'q':
        break
    
cv.destroyAllWindows()
cv.release()

plt.plot(range(175),graylist,'-',linewidth=2.0)

利用帧差法检测运动物体

几个峰值都对应了 眼睛的睁眼闭眼操作。 小波峰对应了眼球的运动,和人的运动导致眼睛的颤抖。